VBScript - перезапустить explorer.exe другого пользователя. - PullRequest
0 голосов
/ 10 августа 2011

Я пишу небольшой VBScript, который отключает параметр выключения в меню «Пуск» Windows XP в определенный день недели, а затем снова включает его на следующий день.Сценарий предназначен для запуска при входе пользователя с ограниченными правами.Поскольку у этого пользователя нет прав на изменение реестра Windows, он должен запускаться с учетной записью администратора.Я настроил запланированное задание, которое запускает сценарий из учетной записи администратора с ограниченным входом пользователя , как описано здесь, пункт 5 .Вот проблема: после применения изменений в реестре Windows, я должен перезапустить этот пользователь explorer.exe, чтобы изменения вступили в силу.Мой сценарий не может сделать это.Он может убить explorer.exe, но по какой-то причине не может перезапустить его.Обратите внимание: если я запускаю сценарий непосредственно из учетной записи администратора, изменяя настройки реестра учетной записи администратора и перезапуская учетную запись администратора explorer.exe, сценарий работает безупречно.Вот часть кода:

Option Explicit
Const RegKey = "HKEY_USERS\LIMITED USER SID HERE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoClose"   
Const BackupDay = 5  'sunday = 1
Dim WshShell

Set WshShell = WScript.CreateObject("WScript.Shell")

If Weekday(Date) = BackupDay Then 

    If WshShell.RegRead(RegKey) = 0 Then

        WshShell.Run "msg * __Message Here__"
        Wscript.Sleep 500

        WshShell.RegWrite RegKey, 1, "REG_DWORD"

        RestartExplorer1
        ' RestartExplorer2 

        WScript.quit

    Else 

[...]

Sub RestartExplorer1()

Dim strComputer, strProcessToKill, objWMIService, colProcess, objProcess

strComputer = "."
strProcessToKill = "explorer.exe"

Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" _ 
    & strComputer _ 
    & "\root\cimv2") 

Set colProcess = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = '" & strProcessToKill & "'")

For Each objProcess in colProcess
    objProcess.Terminate()

Next
End Sub

Процедура RestartExplorer1 должна завершить все процессы explorer.exe (включая процесс администратора, все нормально, как и должно быть)вышли из системы, поэтому их не должно быть, кроме того, я мог фильтровать по имени пользователя и убивать только пользователя, но это не проблема), но абсолютно ничего не делает, если запускается из запланированной задачи из учетной записи администратора.RestartExplorer2 не везет:

Sub RestartExplorer2()

WshShell.Run "cmd /c Taskkill /F /IM explorer.exe"
WScript.Sleep 500
WshShell.Run "cmd /c Start explorer.exe"

End Sub

В этом случае explorer.exe действительно убит, но по какой-то причине не перезапущен.Я искал везде безрезультатно.Спасибо за любую помощь, спасибо.

1 Ответ

0 голосов
/ 11 августа 2011

Вы можете перезапустить процесс Explorer.exe под другой учетной записью пользователя, используя функцию запуска от имени в Windows. Попробуйте это:

Dim objShell, strUsername, strPassword
strUsername = "username"
strPassword = "password"

Set objShell= WScript.CreateObject("WScript.Shell")
objShell.Run "runas /user:" & strusername & " ""explorer.exe"""

WScript.Sleep 100

objShell.Sendkeys strPassword & "~"
WScript.Quit
...