我编写了一个应用程序,我们想要将其分发给大量客户,以便当他们使用特定管理员帐户登录他们的服务器时将其用作 shell 程序。
我已经知道如何更改启动程序,方法是转到Administrative Tools->Computer Management->System Tools->Local Users and Groups->Users
,选择用户属性,转到“环境”选项卡,然后将“启动程序”下的程序文件名更改为我的新应用程序。
但是有没有办法我可以使用一些可以发送出去并在所有这些服务器上运行的代码来实现这一点?
答案1
如果这些服务器位于 Active Directory 中,并且您只关心远程登录(而不是控制台登录),则可以通过组策略执行此操作,具体如下:
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 上的效果如何。我怀疑它不会。
答案2
我终于在 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 服务器都有它。我必须包含这个登录锁定文件代码,因为组策略存在问题,它会制定一个回送操作,导致脚本运行两次。可以关闭此功能,但由于我们无法 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}]
不要忘记包含方括号,并且版本值必须增加每次。后来我发现,有时候最后一行根本不在文件中,必须从头添加。
因此,我花了很多时间尝试,但我能够以编程方式安装登录脚本。我希望有一天其他人也能从这个可怕的东西中受益。