1 (изменено: Rom5, 2012-08-14 09:19:14)

Тема: vbs/hta: обмен "клиента" к "серверу", работающими под разными учетками

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

Поясню желание: есть открытая под "обычной" учеткой веб-страничка Naumen Service Desk, в контекстное меню броузера IE добавляется свой пункт запуска приложения для выполнения неких действий с выделенными на страничке именем машины или учеткой пользователя, но
запускать это приложение нужно от имени другой учетки.

Т.к. и так "по сто раз на дню" набираешь логин-пароль своей админской учетки, то добавлять к этому еще 100 раз ввода хотя бы лишь одного пароля для запуска приложения на своей же машине - нет желания. Хранить где-то пароль админки для авт.использования - неправильно

Возникла идея: запустить утром через "Run as.." от имени админки некий серверный скрипт, который будет слушать появление посылов от клиентов (в моем случае - скриптов, запускаемых из контекстного меню броузера) и при появлении таких команд уже от имени своей учетки будет стартовать приложение админской работы согласно полученных в "посыле" аргументов.

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

В теме коллекции WSH & HTA: обмен данными между скрипт-процессами есть много интересого, но не хотелось бы регистрировать дополнительные библиотеки, поэтому рассматриваю вариант обмена через содержимое файла: клиент создает файл с записью аргументов, а сервер - ждет изменений файла, читает и удаляет файл и исполняет требуемое.

Как вариат - дать ограниченной учетке право на изменение некоего ключа в HKLM реестра машины и обмен вести через реестр.

Подскажите плз еще идею на подобную тематику.

WBR. Roman

2

Re: vbs/hta: обмен "клиента" к "серверу", работающими под разными учетками

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

3

Re: vbs/hta: обмен "клиента" к "серверу", работающими под разными учетками

Rom5, использование реестра для этого — не лучшая идея. Лучше отслеживайте через файл.