web-dev-qa-db-ja.com

ラッパースクリプトを使用せずに、実行中のログオンスクリプトをユーザー(.vbs)から隠すにはどうすればよいですか?

ログオンスクリプト(.vbs)を実行し、それをW2012R2 RDSホストを含​​むOUにリンクするGPO(ループバック置換で構成)があります。

ポリシーに次の(質問関連の)変更を加えました。

Computer Configuration -> Policies -> Administrative Templates -> System -> Group Policy -> Configure Logon Script Delay -> Enabled -> minute: 0 

User Configuration -> Policies -> Windows Settings -> Scripts (Logon/Logoff) -> MyScript.vbs 

User Configuration -> Policies -> Administrative Templates -> System -> Run legacy logon scripts hidden -> Enabled 

User Configuration -> Policies -> Administrative Templates -> System -> Display instructions in logon scripts as they run -> Disabled

ユーザーがログオンすると、スクリプトはフォアグラウンドで完全に実行されますが、私が行った設定によれば、コマンドプロンプトがまったくポップアップしないことを期待していました。では、ここで何が間違っているのでしょうか。また、Microsoftの「レガシースクリプト」の定義は正確には何でしょうか。

非表示のパラメーターを使用してcscript.exeを呼び出す小さな「ラッパースクリプト」を記述できることは承知していますが、これを可能な限りクリーンに保ち、設定が機能しない理由を理解したいと思います。

2
Matze

GPOの設定が正しいので、これの原因を突き止めました。実行する必要のあるスクリプトは、関数を使用して、スクリプトホストの32ビットバージョンを強制します。

Function fncForce32bitCscript()
    Dim strCurrentScriptHost : strCurrentScriptHost  = lcase(wscript.fullname)
    dim strRequiredScriptHost: strRequiredScriptHost = "c:\windows\system32\cscript.exe"
    if fncCheckOS = "X64" Then
        strRequiredScriptHost = "c:\windows\syswow64\cscript.exe"
    end If  

    Dim objShell
    Set objShell = CreateObject("WScript.Shell")
    objShell.run "cscript //h:cscript",0,True

    If strCurrentScriptHost = strRequiredScriptHost Then
        'no switching to cscript required
    Else
      Dim strArgColl
          strArgColl = " "
          If WScript.Arguments.Count>0 Then
            Dim ArgCollect
            For ArgCollect = 0 To WScript.Arguments.Count-1
              strArgColl = strArgColl & chr(34) & (WScript.Arguments.Item(ArgCollect)) & chr(34) & " "
            Next
          End If
          'wscript.echo "script will be re-launched with the required script Host " & strRequiredScriptHost
          objShell.Run  "cmd /C " & strRequiredScriptHost & " " & WScript.ScriptFullName & " " & strArgColl,1,false
          'Set objShell = Nothing
          'wscript.sleep 3000
          WScript.Quit  
    End If
End Function

したがって、この呼び出しをcmd.exe ..に置き換えます。

'objShell.Run "cmd /C " & strRequiredScriptHost & " " & WScript.ScriptFullName & " " & strArgColl, 0, false

...これでそれは隠されて実行されました。ミッション完了。

objShell.Run strRequiredScriptHost & " " & WScript.ScriptFullName & " " & strArgColl, 0, false
1
Matze