0

特定のユーザーの開始プログラムを変更しようとしています。Windows Server 2003 で正常に動作するコードがいくつかあります。

Set objUser = GetObject("WinNT://localhost/sysadmin")
objUser.TerminalServicesInitialProgram = "C:\myapp.exe"
objUser.TerminalServicesWorkDirectory = "C:\"
objUser.SetInfo

ただし、2000 サーバーで実行すると、最初の行で失敗し、次のエラーが表示されます。

エラー: ネットワーク パスが見つかりませんでした。
コード: 80070035
ソース: (null)

同じことを達成する別の方法を見つけました:

Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set colUsers = GetObject("WinNT://" & strComputer)
colUsers.Filter = Array("user")
For Each objUser In colUsers
    If (InStr(objUser.Name, "sysadmin")) Then
        objUser.TerminalServicesInitialProgram = "C:\myapp.exe"
        objUser.TerminalServicesWorkDirectory = "C:\"
    End If
Next

繰り返しますが、これは 2003 年には機能しますが、2000 年にはコードの一部で失敗しIf、次のエラーが発生します。

エラー: オブジェクトはこのプロパティまたはメソッドをサポートしていません: 'objUser.TerminalServicesInitialProgram'
コード: 800A01B6
ソース: Microsoft VBScript ランタイム エラー

2000 と 2003 の両方でAdministrative Tools->Computer Management->System Tools->Local Users and Groups->Users、 に移動してユーザーのプロパティを選択し、Environmentタブに移動して、 の下のプログラム ファイル名を変更できますStarting program。2003 年にそのプロパティにアクセスできるのであれば、2000 年にそのプロパティにアクセスする方法が必要だと思います。そこでプログラムを開始しましたが、うまくいきませんでした。

編集:私は、Nilpo からの回答を組み込んで、これに新しいテスト ユーザーを追加し、次の行のようなものでユーザー オブジェクトを作成する部分を過ぎました。

Set objUser = GetObject("LDAP://CN=joe,CN=Users,DC=lab,DC=server,DC=net")

上記と同じエラーが表示されますObject doesn't support this property or method: 'objUser.TerminalServicesInitialProgram' 。これは、これを行うための 4 つの代替方法が失敗したことを意味します。誰かがこれについて他のアイデアを持っていますか?

4

2 に答える 2

2

WMI を使用した別の方法を次に示します。

Const STARTUP_PROGRAM = "C:\myapp.exe"
Const STARTUP_FOLDER = "c:\"

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_TSEnvironmentSetting")

For Each objItem in colItems
    errResult = objItem.InitialProgram(STARTUP_PROGRAM, STARTUP_FOLDER)
Next

Windows 2000 では、これらの方法はどれもサポートされていません。実際、これらの方法はすべて、Windows XP 以降でのみサポートされています。

ただし、LDAP を使用する別の方法が 1 つあります。また、Windows 2000 Server で動作する可能性は十分にあると思います。

Set objUser = GetObject _
    ("LDAP://cn=MyerKen,ou=Management,dc=NA,dc=fabrikam,dc=com")

objUser.TerminalServicesInitialProgram = "C:\myapp.exe"
objUser.TerminalServicesWorkDirectory = "c:\"

objUser.SetInfo
于 2012-03-23T05:05:22.550 に答える
0

私は最初にこの問題全体を調査し始めたので、ServerFault からこの回答を再投稿しています。


Windows 2000 でこれを行う方法をついに見つけました。これは複数のステップからなるプロセスでした。まず、ログオン時に実行するスクリプトを作成しました。

Set WshNetwork = WScript.CreateObject("WScript.Network")
If WshNetwork.UserName = "sysadmin" Then
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    strLockFile = "C:\logonlock.txt"
    If objFSO.FileExists(strLockFile) Then
        If Now - objFSO.GetFile(strLockFile).DateLastModified < 0.0001 Then 'New file, means was double start, don't run
            objFSO.DeleteFile(strLockFile)
            objFSO.CreateTextFile(strLockFile)
            Set objFSO = Nothing
            WScript.Quit
        End If
    End If
    'File either doesn't exist, or is old, DO run
    If objFSO.FileExists(strLockFile) Then
        objFSO.DeleteFile(strLockFile)
    End If
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
    errResult = objWMIService.Create("C:\loginshell.exe", "C:\", null, intPosID)    
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colProcesses = objWMIService.ExecNotificationQuery ("Select * From __InstanceDeletionEvent " & "Within 1 Where TargetInstance ISA 'Win32_Process'")
    Do Until False = True
        Set objProcess = colProcesses.NextEvent
        If objProcess.TargetInstance.ProcessID = intPosID Then
            objFSO.CreateTextFile(strLockFile)
            Set WshShell = WScript.CreateObject("WScript.Shell")
            WshShell.Run "%COMSPEC% /c ""C:\Program Files\Resource Kit\logoff.exe"" /n /f", 0, False
            Exit Do
        End If
    Loop
Else
    Set WshNetwork = Nothing
End If

Windows 2000 にはログオフ実行ファイルは付属していませんが、それを含む 2000 用のリソース キットのダウンロードがあり、すべての 2000 サーバーにあるようです。このログオンロック ファイル コードを含める必要があったのは、グループ ポリシーに問題があり、ループバックアクションが実行され、スクリプトが 2 回実行されるためです。これをオフにすることは可能ですが、いずれかのサーバーがそれを必要とする可能性があるかどうか 100% ではないため、オンのままにし、回避策を考え出しました。

次に、これをローカル グループ ポリシーのログオン スクリプトに追加するスクリプトを作成する必要がありました。このためのいくつかのコード スニペット:

Set oShell = CreateObject("Wscript.Shell") 
strScriptFile = oShell.ExpandEnvironmentStrings("%SYSTEMROOT%") & "\system32\GroupPolicy\User\Scripts\scripts.ini"

その scripts.ini ファイルは、ログオン時に呼び出されるように vbs ファイルが追加される場所です。次のようになります。

[Logon]
0CmdLine=C:\MyScript.vbs
0Parameters=

そのファイルにスクリプトを追加するコードを書く必要がありました。詳細は読者の演習として残しておきます。:)

最後に、見つけたファイルを次のように変更する必要がありました。

strGptFile = oShell.ExpandEnvironmentStrings("%SYSTEMROOT%") & "\system32\GroupPolicy\gpt.ini"

gpt.ini には、上記のログオン スクリプトを実際に実行するために変更する必要がある行がいくつかあります。最初は次のようになります。

[General]
gPCFunctionalityVersion=0
gPCMachineExtensionNames=
Version=0
gPCUserExtensionNames= 

バージョン番号はゼロ以外の可能性があり、names 行に既に ID がある可能性があります。最後の 2 行は、ログオン スクリプト用に変更する必要があった行です。まず、gpt.ini ファイルが更新されるたびに、バージョン値を 65536 ずつ増やす必要があります。次に、次の 2 つの ID をgPCUserExtensionNames=行に追加する必要があります。

{42B5FAAE-6536-11D2-AE5A-0000F87571E3} {40B66650-4972-11D1-A7CA-0000F87571E3}

最終的には次のようになります。

gPCFunctionalityVersion=0
gPCMachineExtensionNames=
Version=65536
gPCUserExtensionNames=[{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B66650-4972-11D1-A7CA-0000F87571E3}]

角かっこを含めることを忘れないでください。バージョンの値は毎回インクリメントする必要があります。私が後で発見した別のことは、最後の行がファイルにまったく含まれていないことがあり、最初から追加する必要があることでした。

そのため、かなりの試行錯誤が必要でしたが、ログオン スクリプトをプログラムでインストールすることができました。いつか他の誰かがこの怪物から恩恵を受けることができることを願っています.

于 2012-05-15T21:28:10.417 に答える