编程,基于脚本或命令行方法来更改Windows Server 2000/2003上用户的启动程序?

我已经编写了一个应用程序,我们想要分发给大量的客户,当他们用特定的pipe理员帐户login到他们的服务器时用作shell程序。

我已经想通过转到Administrative Tools->Computer Management->System Tools->Local Users and Groups->Users ,selectAdministrative Tools->Computer Management->System Tools->Local Users and Groups->Users的属性,转到环境选项卡,并更改程序如何更改启动程序“开始程序”下的文件名称到我的新应用程序。

但有没有办法,我可以做一些代码,可以发送和运行在所有这些服务器上?

如果这些服务器位于Active Directory中,而您只关心远程login(而不是控制台login),则可以通过组策略在以下位置执行此操作:

User Configuration\Policies\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Remote Session Environment

在这里输入图像说明

根据您的需要设置,然后根据您的条件应用组策略(OU和服务器,组和服务器等)


通过vbscript来做到这一点:

 Set objUser = GetObject("WinNT://localhost/Administrator, user") objUser.TerminalServicesInitialProgram = "TestProg" objUser.TerminalServicesWorkDirectory = "C:\" objUser.SetInfo 

Administrator, user是您定义您的用户/组设置的地方)。 我不知道如何在Windows 2000上工作。 我怀疑它不会。

我终于find了一个在Windows 2000中做到这一点的方法。这是一个多步骤的过程。 首先,我写了这个脚本在login时运行:

 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服务器都有它。 我必须包含此loginlocking文件代码,因为组策略存在问题,它在其中执行环回操作,导致脚本运行两次。 有可能把它closures,但是因为我们不是100%,如果任何服务器可能需要它,我们离开它,只是想出了一个解决方法。

接下来,我需要编写一个脚本将其添加到本地组策略login脚本中。 几个代码片段:

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

scripts.ini文件是为了在login时调用vbs文件而添加的位置。 它看起来像这样:

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

我不得不编写代码来将我的脚本添加到该文件。 我将留给细节作为读者的练习。 🙂

最后,我不得不修改我发现的文件:

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

gpt.ini有几行必须修改才能使上面列出的login脚本实际运行。 以下是最初的样子:

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

版本号可能不是零,并且名称行上可能已经有ID。 最后两行是我必须修改我的login脚本。 首先,只要更新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}] 

不要忘记包括方括号,并且版本值必须每次增加。 我后来发现的其他东西是有时最后一行根本不在文件中,必须从头开始添加。

所以,它花了大量的时间玩,但我能够以编程方式安装login脚本。 我希望有一天有人能从这个怪物中受益。