Назад | Перейти на главную страницу

Программный, сценарий или метод командной строки для изменения начальной программы для пользователя в Windows Server 2000/2003?

Я написал приложение, которое мы хотим распространить среди большого количества клиентов, которые будут использоваться в качестве программы оболочки, когда они входят на свой сервер с определенной учетной записью администратора.

Я понял, как изменить стартовую программу, перейдя в Administrative Tools->Computer Management->System Tools->Local Users and Groups->Users, выбрав свойства для пользователя, перейдя на вкладку «Среда» и изменив имя файла программы в разделе «Запуск программы» на мое новое приложение.

Но есть ли способ сделать это с помощью кода, который можно было бы отправить и запустить на всех этих серверах?

Если эти серверы находятся в Active Directory, и вас беспокоит только удаленный вход (а не вход в консоль), вы можете сделать это с помощью групповой политики в разделе:

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

Настройте это по своему усмотрению, а затем примените эту групповую политику к вашим условиям (OU и Server, Group и Server и т. Д.)


Для этого через vbscript:

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

(где Administrator, user здесь вы определяете настройки пользователя / группы). Я не знаю, насколько хорошо это работает в Windows 2000. Я подозреваю, что это не так.

Я наконец нашел способ сделать это в 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 не поставляется с исполняемым файлом выхода из системы, но есть загружаемый Resource Kit для 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= 

Номера версий могут быть ненулевыми, и в строках имен уже могут быть идентификаторы. Последние две строки мне пришлось изменить для сценария входа в систему. Во-первых, значение версии должно увеличиваться на 65536 при каждом обновлении файла gpt.ini. Во-вторых, вы должны добавить следующие два идентификатора в 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}]

Не забудьте указать квадратные скобки, а значение версии необходимо увеличить. каждый раз. Позже я обнаружил еще кое-что, что иногда последней строки нет в файле, и ее нужно добавлять с нуля.

Итак, мне потребовалась масса экспериментов, но я смог программно установить сценарий входа в систему. Я надеюсь, что кто-нибудь когда-нибудь получит пользу от этого чудовища.