我正在尝试更改特定用户的启动程序。我有一些代码在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'
这意味着尝试执行此操作的四种替代方法都失败了。有没有人对此有任何其他想法?
答案 0 :(得分: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及更新版本。
但是,有一个other way使用LDAP。我相信它很有可能在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
答案 1 :(得分: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服务器都有它。我必须包含此logonlock文件代码,因为组策略存在问题,它会执行loopback操作,导致脚本运行两次。有可能将其关闭,但由于我们不是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=
版本号可能非零,并且名称行上可能已有ID。最后两行是我必须为我的登录脚本修改的行。首先,每当更新gpt.ini文件时,版本值必须增加65536。其次,您必须将以下两个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}]
不要忘记包括方括号,每次时,Version值必须递增。我后来发现的其他东西是有时最后一行根本不在文件中,必须从头开始添加。
所以,它花了很多时间,但我能够以编程方式安装登录脚本。我希望有一天能有其他人从这种怪物中受益。