Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows NT/2000/2003 (http://forum.oszone.net/forumdisplay.php?f=5)
-   -   Удалённое выполнение сценариев (http://forum.oszone.net/showthread.php?t=72481)

Antichrist 06-10-2006 04:18 494087

Удалённое выполнение сценариев
 
Есть домен под 2003 ,все клиенты XP ,есть необходимость удалённо запускать wsh сценарии в любой момент времени и желательно с правами администратора ,для примера такой сценарий :
Код:

Set objSysInfo = CreateObject("ADSystemInfo")
Set objComputer = GetObject _
    ("LDAP://" & objSysInfo.ComputerName)
Set CurrentUser = GetObject("LDAP://" & objSysInfo.UserName)
objComputer.Put "Description" , CurrentUser.DisplayName
objComputer.SetInfo

Пишет в описании компа в AD имя пользователя ,но сам сценарий не важен ,их очень много для различных целей.
Запуск из логон скрипта неподходит, вопервых потому как запускается только в момент самого логона ,во вторых с правами пользователя ,запуск по шедулеру тоже ,неудобно...
pcexec тоже не то ,процессы удалённо и так запускать умею через WMI ,не то.

Нашол такой код в репозитории микрософта используется так Script_name remote_comp

Код:

On Error Resume Next

If Wscript.Arguments.Count = 0 Then
    Wscript.Echo "You must enter the computer name when starting this script."
    Wscript.Quit
End If

strComputer = Wscript.Arguments.Item(0)

Set objShell = CreateObject("WScript.Shell")
strCommand = "%comspec% /c ping -n 3 -w 1000 " & strComputer & ""
Set objExecObject = objShell.Exec(strCommand)

Do While Not objExecObject.StdOut.AtEndOfStream
    strText = objExecObject.StdOut.ReadAll()
    If Instr(strText, "Reply") > 0 Then

        ' =====================================================================
        ' Insert your code here
        ' =====================================================================

        Set objComputer = GetObject("WinNT://" & strComputer & "")
        objComputer.Filter = Array("User")
        For Each objUser in objComputer
            Wscript.Echo objUser.Name
        Next

        ' =====================================================================
        ' End
        ' =====================================================================

    Else
        Wscript.Echo strComputer & " could not be reached."
    End If
Loop

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

Вопрос как осущевствить запуск сценария на удалённой машине с правами администратора ?

Vasosel 11-10-2006 12:15 496221

Приведенный скрипт делает следующее:

получает имя компьютера как аргумент командной строки;
пытается его пингануть 3 раза;
если в выводе программы ping (STDOUT) находит строку Reply, то получает список пользователей этого компьютера и выводит их на экран(вот тут пес знает, что именно вернет Array("User"), надо тестить)

Т.е. на удаленной машине он и не должен выполняться.

Чтобы выполнить скрипт на удаленной машине с правами локального администратора, необходимо добавить этот скрипт в автозагрузку (конфигурация компьютера)
Чтобы выполнить скрипт на удаленной машине с правами пользователя, необходимо добавить этот скрипт в логон-скрипты (конфигурация пользователя)
Если необходимо выполнять скрипт в процессе работы, можно покопаться в сторону RPC, мне в руки как-то попадалась утилита, позволяющая выполнить команду/запустить программу на удаленной машине.

Только зачем это нужно? если выполнить приведенный аффтором сценарий

Set objSysInfo = CreateObject("ADSystemInfo")
Set objComputer = GetObject _
("LDAP://" & objSysInfo.ComputerName)
Set CurrentUser = GetObject("LDAP://" & objSysInfo.UserName)
objComputer.Put "Description" , CurrentUser.DisplayName
objComputer.SetInfo

с правами администратора, то в Description передастся имя администратора, а не пользователя, который под ним залогинен.

Antichrist 12-10-2006 03:56 496531

По поводу последнего скрипта уже и так понятно ,он впринципе работать не будет от пользователя ,на него я уже зибил.
Через RPC не полуится ,через него насколько я понял только процессы можно запускать
таким вот образом
Код:

Const SW_NORMAL = 1
strComputer = "administrator"
strCommand = "c:\test.vbs"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

' Configure the Notepad process to show a window
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = SW_NORMAL

' Create Notepad process
Set objProcess = objWMIService.Get("Win32_Process")
intReturn = objProcess.Create _
    (strCommand, Null, objConfig, intProcessID)
If intReturn <> 0 Then
    Wscript.Echo "Process could not be created." & _
        vbNewLine & "Command line: " & strCommand & _
        vbNewLine & "Return value: " & intReturn
Else
    Wscript.Echo "Process created." & _
        vbNewLine & "Command line: " & strCommand & _
        vbNewLine & "Process ID: " & intProcessID
End If

Работает отлично ,но ограничение есть в том что пользовательне может взаимодействовать с процессом ,можно конечно попробовать wscript с араметром запускать ,но это не совсем то.
Поидее вот таким скриптом можно запустить любой сценарий на удалённой машине в процессе работы
Код:

strRemoteComputer = "target_comp"
strWorkerScript = "mount.vbs"
Set objWshController = WScript.CreateObject("WshController")
Set objRemoteScript = _
objWshController.CreateScript(strWorkerScript, strRemoteComputer)
objRemoteScript.Execute

Do While Not objRemoteScript.Status = 2
 Wscript.Sleep(100)
 Wscript.Echo "Remote script not yet complete."
Loop

Запускаю на target_comp скрипт mount.vbs в котором содержится просто
Код:

Set WshNetwork = CreateObject("WScript.Network")
'Монтируем Обмен на серваке как диск Y:
WshNetwork.MapNetworkDrive "x:", "\\server\install"

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

Vadikan 12-10-2006 06:01 496545

А почему не пользуемся тегом code?


Перенесено обратно в NT. Все-таки вопрос связан с администрированием клиентов, а это тема NT-форума, несмотря на тип клиентской ОС.

Antichrist 12-10-2006 06:06 496549

сорри ,запамятовал исправлюсь ,почему перенесли тоже не в курсе ,думаю это как раз админам нужно ,а большинство обитает в 2k3


Время: 10:14.

Время: 10:14.
© OSzone.net 2001-