Rom5 пишет:Есть желание приложением, работающим под ограниченной учеткой, запустить новый процесс от имени приложения уже работающего под админской учеткой (работа на одной машине).
[..]
В теме коллекции WSH & HTA: обмен данными между скрипт-процессами есть много интересого, но не хотелось бы регистрировать дополнительные библиотеки, поэтому рассматриваю вариант обмена через содержимое файла: клиент создает файл с записью аргументов, а сервер - ждет изменений файла, читает и удаляет файл и исполняет требуемое.
Как вариат - дать ограниченной учетке право на изменение некоего ключа в HKLM реестра машины и обмен вести через реестр.
Разрешилась идея таки через реестр. С сокетами - не хватило ума доработать коллекционный пример, чтобы сервер слушал не один посыл от клиента(, да и регистрировать надо библиотеку. С мониторингом появления файла в папке - некая тормознутость имеется, а вот с отслеживанием изменения параметра в реестре - все очень оперативно.
Для возможности отслеживания параметра в ключе реестра надо чтобы этот ключ существовал (в моем случае - hklm\SOFTWARE\IE_CompAction), а чтобы пользователь мог в него писать - пользователям машины надо выдать права. Для этого сделал "сетапный" батник:
@Echo ____Create-n-Permission [Users]___
reg add HKEY_LOCAL_MACHINE\SOFTWARE\IE_CompAction
subinacl.exe /keyreg "HKEY_LOCAL_MACHINE\SOFTWARE\IE_CompAction" /grant="builtin\users"=f
@Echo.
@Pause
Сам скрипт запускаемый от админской учетки:
' ----- monitorReg--start.vbs
' Скрипт должен быть стартован от имени административной учетки.
' Скрипт следит в реестре за изменением значения параметра HKLM\SOFTWARE\IE_CompAction\DT_created и, если значение
' изменилоось, то считывается и запускается на выполнение значение HKLM\SOFTWARE\IE_CompAction\start_cmd
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim gsPathApp
gsPathApp = fso.GetAbsolutePathName(".") & "\" 'путь к каталогу запуска задачи'
Dim gsTitle : gsTitle = "Script `monitorReg--start.vbs`" 'для заголовка диалоговых окон'
'''' ---- from http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/registry/
Set wmiServices = GetObject("winmgmts:root/default")
Set wmiSink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
wmiServices.ExecNotificationQueryAsync wmiSink, _
"SELECT * FROM RegistryValueChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE'" & _
" AND KeyPath='SOFTWARE\\IE_CompAction'" & _
" AND ValueName='DT_created'"
MsgBox "Listening for Registry Change Events..." & vbCrLf & vbCrLf & _
"(To terminate a run 'monitorReg--stop.vbs')",vbInformation,gsTitle
While(1)
WScript.Sleep 1000
Wend
'--- обработка события изменения параметра реестра'
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
readCmd = oShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\IE_CompAction\start_cmd")
If Len(readCmd)=0 Then
'--- считан пустой параметр
MsgBox "Через реестр передана пустая командная строка",vbExclamation,gsTitle
Else
If readCmd<>"stop" Then
' создаем в каталоге задачи временный батник для запуска через него полученной строки'
sRunFile = gsPathApp & "last_start.cmd"
Set fspo=FSO.OpenTextFile(sRunFile, 2, True)
fspo.WriteLine readCmd
fspo.Close
Set fspo = Nothing
''
oShell.Run sRunFile
Else
'--- предлагаем закрыть скрипт'
If MsgBox("Остановить скрипт мониторинга реестра ?",vbQuestion+vbYesNo,gsTitle)=vbYes Then
MsgBox "Stopped Listening registry changes.",vbExclamation,gsTitle
WScript.Quit
End IF
End IF
End IF
End Sub
Если вдруг надо остановить слежение за реестром, запускаю уже от обычной учетки скрипт:
' ----- monitorReg--stop.vbs
' Скрипт предназначен для инициации останова скрипта слежения за реестром "monitorReg--start.vbs".
' Скрипт измененят параметра HKLM\SOFTWARE\IE_CompAction\DT_created для срабатывания "monitorReg--start.vbs"
' и пишет значение "stop" в параметр HKLM\SOFTWARE\IE_CompAction\start_cmd
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\IE_CompAction\start_cmd", "stop", "REG_SZ"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\IE_CompAction\DT_created", Now(), "REG_SZ"
Передаваемая реестром команда старта приложения в моем случае выглядит в виде строки
start "" /D"каталог задачи" приложение.hta учетка_машины/пользователя
поэтому скрипт из реестра сначала выгружает командную строку во временный батник и запускает уже его.
Запись в реестр команды с параметрами и признака старта (текущее время) у меня выполняется уже из нескольких приложений, работающих под ограниченной учеткой - это страничка контекстного меню броузера в Наумен и макрос из эксельной таблицы со списком пользователей, которые в данный момент на тех/поддержке.
Взять пример приложения передачи в реестр параметров из броузера можно на проекте - small-scripts..IE_CompAction. Может кому-то пригодится.
WBR. Roman