none
Script VBS che non girano tramite GPO RRS feed

  • Domanda

  • Ciao,
    da qualche giorno sto combattendo con una stranezza delle GPO.

    In un PDC server 2016 ho creato una GPO così:
    Configurazione computer
    -Impostazioni di Windows
    --Script
    ---Avvio
    ----Script.VBS

    All'avvio dei PC collegati con quel PDC, lo script VBS non funziona.

    Considerate che:
    La OU dove è messo lo script è quella dove "abitano" i PC
    Nei filtri di sicurezza ho messo il gruppo Computer del Dominio (del quale i PC fanno parte)
    Nella Delega ho messo Authenticated Users (anche se non credo occorra)
    La cartella dello script è perfettamente raggiungibile dall'utente SYSTEM
    Se metto uno script di Powershell invece di quello VBS, funziona (traslare il VBS in PS1 sarebbe un lavoraccio, anche per le future eventuali manutenzioni)
    Se sposto l'avvio dello script da Computer a Utente funziona
    In un attimo di follia ho messo nei filtri di sicurezza dell'ambito anche Everyone

    Qualcuno può aiutarmi?

    Grazie
    giovedì 11 aprile 2019 11:07

Risposte

  • Ciao Gastone, grazie per l'interessamento.

    Nemmeno io amo il VBScript e preferisco di gran lunga Powershell.

    Lo script finale, in realtà, mi arriva già bello e fatto dal fornitore del programma (ecco perché VBS, lo subisco).

    Quello che vedi è solo un estratto, tanto per iniziare a far funzionare qualcosa, è solo lo zoccolo che mi serve per capire cosa c'è che non va.

    Rifare lo script come tu mi hai consigliato è la stessa cosa che rifarlo completamente in PS, ma perderei tutti gli aggiornamenti e le "nuove versioni" dello script.

    Un conto è modificare una o due righe, un'altro è rifare lo script.

    Grazie ancora per l'interessamento.

    Inutile partire da un sottoinsieme di uno script che non puoi/vuoi modificare...

    Se lo pubblicavi tutto intero avrei potuto dire qualcosa al riguardo, dal sottoinsieme già ho evidenziato le problematiche di un script che installa/aggiorna direttamente da una risorsa di rete, spero che usi un option explicit ...

    Tornando a noi, a questo punto dobbiamo capire se vanno o non vanno i vbscript come script di avvio, quindi tralasciamo lo script complesso ... prova  il seguente

    
    
    Option Explicit
    Dim objFSO, objFolder, objShell, objTextFile, objFile
    Dim strFolder, strFileLog, strText, sLogFileDate
    
    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8
    
    strFolder = "c:\log"
    strFileLog = "\test.txt"
    strText = "ci metto qualcosa dentro"
    
    sLogFileDate = " " & Date & "_" & Hour(Now) & "-" & _
                   Minute(Now) & "-" & Second(Now) & " creato"
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    If objFSO.FolderExists(strFolder) Then
       Set objFolder = objFSO.GetFolder(strFolder)
    Else
       Set objFolder = objFSO.CreateFolder(strFolder)
       'WScript.Echo "Creata " & strFolder
    End If
    If objFSO.FileExists(strFolder & strFileLog) Then
       Set objFolder = objFSO.GetFolder(strFolder)
    Else
       Set objFile = objFSO.CreateTextFile(strFolder & strFileLog)
       'Wscript.Echo "creato " & strFolder & strFileLog
    End If
    
    
    Set objTextFile = objFSO.OpenTextFile _
    (strFolder & strFileLog, ForAppending, True)
    
    objTextFile.WriteLine(strText & sLogFileDate)
    objTextFile.Close
    
    set objFile = nothing
    set objFolder = nothing
    set objTextFile = nothing
    set objFSO = nothing
    set objShell = nothing
    WScript.Quit

    Lo script crea il folder c:\log , se non esiste, poi crea il file test.txt e all'interno scrive data e ora di esecuzione.

    Una volta che riuscirai a farlo funzionare come script di avvio, potrai sostituirlo con il tuo e avrai la certezza che i problemi sono nello script che ti forniscono!

    Ciao Gastone

    PS: Togli assolutamente il "On Error Resume Next" se vuoi capire cosa stia facendo il tuo script


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere

    martedì 30 aprile 2019 21:10
    Moderatore
  • Se sostituendo lo script VBS con uno PowerShell quest'ultimo funziona vuol dire che dipende dal codice dello script, non dalle impostazioni di sicurezza della GPO.
    Infatti, il fatto che funziona correttamente impostandolo come script di login utente, è un segnale che il codice all'interno dello script stesso non è in grado di andare in esecuzione fuori da un contesto utente. 
    Inoltre è uno script che richiede molto tempo per l'esecuzione? 
    venerdì 12 aprile 2019 07:09
    Moderatore

Tutte le risposte

  • Se sostituendo lo script VBS con uno PowerShell quest'ultimo funziona vuol dire che dipende dal codice dello script, non dalle impostazioni di sicurezza della GPO.
    Infatti, il fatto che funziona correttamente impostandolo come script di login utente, è un segnale che il codice all'interno dello script stesso non è in grado di andare in esecuzione fuori da un contesto utente. 
    Inoltre è uno script che richiede molto tempo per l'esecuzione? 
    venerdì 12 aprile 2019 07:09
    Moderatore
  • si può sapere cosa deve fare lo script ?

    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    lunedì 15 aprile 2019 10:29
    Moderatore
  • si può sapere cosa deve fare lo script ?

    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    Chiedo scusa per la "latitanza".

    Lo script definitivo è più complesso, ho creato uno script slim per poi aggiungere pezzi, ma anche questo non funziona

    =============

    ' =======================================================
    ' Modificare i domini dove risiedono i LOG e i Programmi
    ' =======================================================
    Dim WshShell
    Set WshShell = CreateObject("WScript.Shell")
    strLogonServer  = WshShell.ExpandEnvironmentStrings("%LOGONSERVER%")
    strComputerName = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
    domTempFolder = strLogonServer & "\Tmp\" & strComputername
    pathOfWFBSHInstaller="msiexec /qn /i """ & strLogonServer & "\netlogon\Agent_Installer.msi"""
    strComputer = "."
    strOutput = ""
    serviceCount = 0
    totalServiceCountToCheck = 3

    Set wshNetwork = CreateObject( "WScript.Network" )
    'strUserName = wshNetwork.UserName

    On Error Resume Next

    Dim g_logFolderPath

    Sub PrepareLogFolder()
        g_logFolderPath = ""
        Set objFileSysObject = CreateObject("Scripting.FileSystemObject")
    '    g_logFolderPath = domTempFolder & "\Installer_Debug\" & strUserName
        g_logFolderPath = domTempFolder
    '    Wscript.Echo "Temp " & g_logFolderPath
        If Not objFileSysObject.FolderExists(g_logFolderPath) Then
            objFileSysObject.CreateFolder(g_logFolderPath)
        End If
        If Not objFileSysObject.FolderExists(g_logFolderPath) Then
            g_logFolderPath = ""
        End If
    End Sub

    Sub WriteToLog(strMsg, truncateLog)
        If Len(g_logFolderPath) = 0 Then
            Exit Sub
        End If
    '    Wscript.Echo strMsg
        Dim objFileSysObject, objTextFile    
        Dim openMode
        Const openForWriting = 2
        Const openForAppending = 8
        Dim dateTimeNow : dateTimeNow = now()
        Dim strNewMsg : strNewMsg = dateTimeNow & " [LoginScript] " & strMsg
        Set objFileSysObject = CreateObject("Scripting.FileSystemObject")
        If Not objFileSysObject.FolderExists(g_logFolderPath) Then
            objFileSysObject.CreateFolder(g_logFolderPath)
        End If
        If truncateLog = True Then
            openMode = openForWriting
        Else
            openMode = openForAppending
        End If
        Set objTextFile = objFileSysObject.OpenTextFile(g_logFolderPath & "\" & "LoginScript.log", openMode, True)
        objTextFile.WriteLine(strNewMsg)
        objTextFile.Close
    END Sub


    PrepareLogFolder
    WriteToLog "Begin >>>", True
    WriteToLog "Finish <<<", False

    ==================

    sabato 27 aprile 2019 07:41
  • Premetto che non ho mai amato Vbscript, troppo codice per scrivere un log file, anche eseguire un comando con " e & diventa illeggibile (i batch dos sono poco leggibili, ma  vbs+coamandidos sono un calvario: "msiexec /qn /i """ & strLogonServer & "\netlogon\Agent_Installer.msi""").

    Per installare Software, io, di solito copio il file msi in locale e poi lo eseguo così da avere maggiori garanzie di successo, aggiungo nel batch un robocopy dell'installativo e solo a copia finita parte l'esecuzione.

    Togli assolutamente il "On Error Resume Next" se vuoi capire cosa stia facendo il tuo script, lo rimetterai appena tutto funzionerà.

    Ho riscritto il tuo VBS, in realtà è leggermente diverso, perchè esegue anche il fle msi, mentre, il tuo scrive solo le righe di inizio e fine.

    @echo off REM InstallDiAvvio.cmd
    setlocal SET filename=%~n0 SET domTempFolder=%LOGONSERVER%\Tmp\%COMPUTERNAME% SET logfile="%domTempFolder%\Installer_Debug\%UserName%\_%filename%.LoginScript.log" SET accodaLOG=^>^> %logfile% 2^>^&1 SET rewriteLOG=^> %logfile% 2^>^&1

    :: Comando da eseguire
    SET msiFullPath="%LOGONSERVER%\netlogon\Agent_Installer.msi"
    IF not exist "%msiFullPath%" goto :ERRMSI SET installCMD=msiexec /qn /i "%LOGONSERVER%\netlogon\Agent_Installer.msi" :: Preparo il log folder if not exist "%domTempFolder%" (mkdir "%domTempFolder%" || goto :ERR) if not exist "%domTempFolder%\Installer_Debug" (mkdir "%domTempFolder%\Installer_Debug" || goto :ERR) if not exist "%domTempFolder%\Installer_Debug\%UserName%" (mkdir "%domTempFolder%\Installer_Debug\%UserName%" || goto :ERR) :: MAIN ECHO BEGIN %date%_%time% ^>^>^> %rewriteLOG% REM Eseguo il comando di installazione REM il comando msiexec verrà eseguito in modalità asicrona, REM il FINISH non coinciderà con la fine dell'installazione... REM Dovrebbe essere qualcosa di simile: start "installa e aspetta" /wait %installCMD% REM ma per ora facciamo le cose facili %installCMD% ECHO FINISH %date%_%time% ^<^<^< %accodaLOG% goto :END

    :ERRMSI Echo MSI non trovato
    ECHO Alle %TIME% del %date% >>"%TEMP%\ERR_%filename%.log" goto :END

    :ERR REM Scrivo qualcosa in locale, qualora qualcosa non funzioni nella rete ... REM la %TEMP% sarà relativa all'utente (c:\windows\temp se si tratta di uno startup script) ECHO Errore creando i folders ECHO Errore creando i folders >"%TEMP%\ERR_%filename%.log" ECHO Alle %TIME% del %date% >>"%TEMP%\ERR_%filename%.log" :END

    In un primo momento potrebbe sembrare più criptico del vbscript... ti consiglio di passare a powershell se vuoi fare un salto di qualità, una semplice regola può essere: script semplici batch dos, script complessi powershell e bye bye a vbscript

    Ciao Gastone


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere


    sabato 27 aprile 2019 16:00
    Moderatore
  • Ciao Gastone, grazie per l'interessamento.

    Nemmeno io amo il VBScript e preferisco di gran lunga Powershell.

    Lo script finale, in realtà, mi arriva già bello e fatto dal fornitore del programma (ecco perché VBS, lo subisco).

    Quello che vedi è solo un estratto, tanto per iniziare a far funzionare qualcosa, è solo lo zoccolo che mi serve per capire cosa c'è che non va.

    Rifare lo script come tu mi hai consigliato è la stessa cosa che rifarlo completamente in PS, ma perderei tutti gli aggiornamenti e le "nuove versioni" dello script.

    Un conto è modificare una o due righe, un'altro è rifare lo script.

    Grazie ancora per l'interessamento.

    martedì 30 aprile 2019 15:40
  • Ciao Gastone, grazie per l'interessamento.

    Nemmeno io amo il VBScript e preferisco di gran lunga Powershell.

    Lo script finale, in realtà, mi arriva già bello e fatto dal fornitore del programma (ecco perché VBS, lo subisco).

    Quello che vedi è solo un estratto, tanto per iniziare a far funzionare qualcosa, è solo lo zoccolo che mi serve per capire cosa c'è che non va.

    Rifare lo script come tu mi hai consigliato è la stessa cosa che rifarlo completamente in PS, ma perderei tutti gli aggiornamenti e le "nuove versioni" dello script.

    Un conto è modificare una o due righe, un'altro è rifare lo script.

    Grazie ancora per l'interessamento.

    Inutile partire da un sottoinsieme di uno script che non puoi/vuoi modificare...

    Se lo pubblicavi tutto intero avrei potuto dire qualcosa al riguardo, dal sottoinsieme già ho evidenziato le problematiche di un script che installa/aggiorna direttamente da una risorsa di rete, spero che usi un option explicit ...

    Tornando a noi, a questo punto dobbiamo capire se vanno o non vanno i vbscript come script di avvio, quindi tralasciamo lo script complesso ... prova  il seguente

    
    
    Option Explicit
    Dim objFSO, objFolder, objShell, objTextFile, objFile
    Dim strFolder, strFileLog, strText, sLogFileDate
    
    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8
    
    strFolder = "c:\log"
    strFileLog = "\test.txt"
    strText = "ci metto qualcosa dentro"
    
    sLogFileDate = " " & Date & "_" & Hour(Now) & "-" & _
                   Minute(Now) & "-" & Second(Now) & " creato"
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    If objFSO.FolderExists(strFolder) Then
       Set objFolder = objFSO.GetFolder(strFolder)
    Else
       Set objFolder = objFSO.CreateFolder(strFolder)
       'WScript.Echo "Creata " & strFolder
    End If
    If objFSO.FileExists(strFolder & strFileLog) Then
       Set objFolder = objFSO.GetFolder(strFolder)
    Else
       Set objFile = objFSO.CreateTextFile(strFolder & strFileLog)
       'Wscript.Echo "creato " & strFolder & strFileLog
    End If
    
    
    Set objTextFile = objFSO.OpenTextFile _
    (strFolder & strFileLog, ForAppending, True)
    
    objTextFile.WriteLine(strText & sLogFileDate)
    objTextFile.Close
    
    set objFile = nothing
    set objFolder = nothing
    set objTextFile = nothing
    set objFSO = nothing
    set objShell = nothing
    WScript.Quit

    Lo script crea il folder c:\log , se non esiste, poi crea il file test.txt e all'interno scrive data e ora di esecuzione.

    Una volta che riuscirai a farlo funzionare come script di avvio, potrai sostituirlo con il tuo e avrai la certezza che i problemi sono nello script che ti forniscono!

    Ciao Gastone

    PS: Togli assolutamente il "On Error Resume Next" se vuoi capire cosa stia facendo il tuo script


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere

    martedì 30 aprile 2019 21:10
    Moderatore
  • Ciao Gastone, grazie al tuo script sono risalito al problema...anzi ai problemi.

    1) il mio script di base (che ingloba quello del fornitore) scrive il log in rete, per qualche bizzarro motivo le istruzioni di creazione del file seguita dalla scrittura del recod, restituiscono un errore di accesso negato.
    Bisogna creare il file, chiuderlo, aprirlo in append quindi scriverci sopra.

    2) la variabile %LOGONSERVER% a quel livello non funziona (quindi tornava un errore perché facendo parte del percorso non accetta i segni %), l'ho sostituita con un'interrogazione LDAP

    Ora la base funziona come un orologio e posso tenere aggiornato lo script solo con un copia-e-incolla.

    Grazie per lo spunto.

    P.s.: avendo cambiato fin da subito la costante strFolder con il path in rete, il tuo script non funzionava....perdonami, ti ho dato del "salame" ;-) in seguito ho capito che il salame non eri tu XD

    venerdì 31 maggio 2019 12:58
  • Ciao Gastone, grazie al tuo script sono risalito al problema...anzi ai problemi.

    1) il mio script di base (che ingloba quello del fornitore) scrive il log in rete, per qualche bizzarro motivo le istruzioni di creazione del file seguita dalla scrittura del recod, restituiscono un errore di accesso negato.
    Bisogna creare il file, chiuderlo, aprirlo in append quindi scriverci sopra.

    Non ci sono bizzarri motivi... ma solo: disattenzioni, configurazioni particolari sfuggite a prima vista, presunti concetti di funzionamento errati

    2) la variabile %LOGONSERVER% a quel livello non funziona (quindi tornava un errore perché facendo parte del percorso non accetta i segni %), l'ho sostituita con un'interrogazione LDAP

    Nella prima correzione del tuo script, ero stato poco attento e avevo ripreso il %LOGONSERVER% che i fase si startup non esiste!! All'avvio si ha un subset delle variabili...

    Ora la base funziona come un orologio e posso tenere aggiornato lo script solo con un copia-e-incolla.

    Toglierei "come un orologio" la userei dopo un bel numero di copia incolla... quando incolli qualcosa di altri il mix potrebbe nascondere insidie "bizzarre"

    Grazie per lo spunto.

    P.s.: avendo cambiato fin da subito la costante strFolder con il path in rete, il tuo script non funzionava....perdonami, ti ho dato del "salame" ;-) in seguito ho capito che il salame non eri tu XD

    La scrittura in locale ("Se sposto l'avvio dello script da Computer a Utente funziona") e nessuna variabile di ambiente, erano ASSOLUTAMENTE VOLUTE e non doveva essere modificato. infatti dico:  "Una volta che riuscirai a farlo funzionare come script di avvio..."

    Ciao Gastone

    PS: poca esperienza + script +NT AUTHORITY\SYSTEM + rete = error 5


    Gastone Canali >http://www.armadillo.it


    Se alcuni post rispondono al tuo quesito(non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili. GRAZIE! Ricorda di dare un occhio ai link Click Here andHere



    sabato 1 giugno 2019 13:31
    Moderatore