PDA

Показать полную графическую версию : Удаленный запуск HTA-приложения от имени текущего пользователя


x wanderer
23-03-2010, 09:30
День добрый!
Имеем HTA-приложение (анкета) заполняющее несколько атрибутов в Active Directory для объекта пользователя, запустившего анкету. В AD на эти несколько аттрибутов розданы права на запись для "NT AUTHORITY\SELF" (т.е. каждый юзер может менять только собственные аттрибуты). Все отлично работает, если анкета запускается через logon-script (как и было задумано). Некоторые пользователи упорно игнорируют заполнение анкеты, не завершают сеанс месяцами, либо из-за сбоев в домене к ним не применяется групповая политика . Хочется форсировать запуск у самых упорных, т.е. как имея права администратора на рабочей станции, запустить программу от имени и в сеансе обычного пользователя.

P.S. Сразу скажу что задача не столь тривиальная (psexec/runas/schtask - все хотят пароль учетной записи), как многим может показаться, т.к. пароль пользователя мне не известен и узнавать его нет смысла - пользователей более 300 душ.

vitaliyboch
15-04-2010, 10:39
Как-то решал похожую задачу: требовалось отследить компьютеры, которые не перезагружаются больше месяца и вынудить пользователя перезагрузить компьютер, причем это должен был сделать именно пользователеь, чтобы потом не было жалоб на потерянные данные.

Выход нашел только один:
1. Написал приложение, которое в System Tray каждые 15 минут показывает облако, что нужно перезагрузить компьютер.
2. Руками (или скриптом) ставил его в планировщик на запуск один раз через 3 минуты от создания задания с режимом интерактивности (чтобы пользователь видел уведомления).
3. Как только приложение запускается, пользователь около часов видит иконку, и каждые 15 минут ему вываливается предупреждение, что компьютер нуждается в перезагрузке.
4. Как только компьютер перезагружен, задание пропадает и пользователь больше не уведомляется, что он давно не перегружал компьютер.

Потом усовершенствовал программу и поставил ее как сервис, который время от времени проверяет как долго компьютер не перезагружали и, если требуется, появляется в System Tray. Но решение не прижилось, так как нужно было брать на себя отвественность за стабильность программы, дорабатывать ее и т.п., а времени на это нет - я администратор, а не программист.

Итак, к чему все это рассказал. У нас в компании адресная книга тоже заполняется через HTA-приложение, которое запускается при логоне пользователя с определенными проверками (не чаще, чем раз в месяц, чтобы не нервировать пользователей). А так как нельзя запустить приложение от имени пользователя, не зная его пароля, то только и остается, что заставить его перезагрузить компьютер и применить доменные политики.

Вот скрипт, как постваить программу-уведомлялку в планировщик удаленного компьютера. Но скажу сразу, что, возможно, тут что-то напутано с определение времени запуска команды. Я потом его переделывал. Если интересно, то последняя версия скрипта вот тут Выполнение команды на удаленном компьютере (http://sysengineering.ru/Administration/ScriptExamples.aspx#SetTask).

set oShell = createobject("wscript.shell")
set oFSO = createobject("Scripting.FileSystemObject")
sWinDir = oShell.ExpandEnvironmentStrings("%WinDir%")
'Проверка наличия на компьютере файла HaveToReboot.exe, удаление его
If oFSO.FileExists(sWinDir & "\HaveToReboot.exe") Then oFSO.DeleteFile sWinDir & "\HaveToReboot.exe",True
'Копирование файла HaveToReboot.exe в папку Windows
oFSO.CopyFile oShell.CurrentDirectory & "\HaveToReboot.exe", sWinDir & "\",True
'Указание пути к файлу HaveToReboot.exe на компьютере
sCommand = sWinDir & "\HaveToReboot.exe"
'Указание имени компьютера (точка указывает на самого себя)
sComputer = "."
'Подключение к WMI для создания запроса
Set oWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
'Запрос всех объектов класса Win32_TimeZone (временная зона)
Set oColTime = oWMIService.ExecQuery("Select * from Win32_TimeZone")
'Получение информации о текущем часовом поясе компьютера
For each oTime in oColTime
if Month(Date) > 4 and Month(Date) <= 11 then
iLocalBias = oTime.Bias - oTime.DaylightBias
else
iLocalBias = oTime.Bias
end if
Next
'Создание времени запуска задания: YYYYMMDDHHMMSS.MMMMMM(+-)OOO"
'Выбор смещения часовой зоны: OOO
Select case Len(cStr(Abs(iLocalBias)))
case "0"
ATCommand = "Error! No information about remote computer time settings."
wscript.quit
case "1"
sLocalBias = "00" & cStr(Abs(iLocalBias))
case "2"
sLocalBias = "0" & cStr(Abs(iLocalBias))
case else
sLocalBias = cStr(Abs(iLocalBias))
End select
'Выбор знака для смещения часовой зоны (+-)OOO
If iLocalBias >= 0 then
sOOO = "+" & sLocalBias
Else
sOOO = "-" & sLocalBias
End if
'Выбор времени запуска задания (3 минуты от текущего времени)
If Len(cStr((Minute(Time) + 3))) = 1 then
sMM = "0" & cStr(Minute(Time) + 3)
Else
sMM = cStr(Minute(Time) + 3)
End if
If Len(cStr(Hour(Time))) = 1 then
sHH = "0" & cStr(Hour(Time))
Else
sHH = cStr(Hour(Time))
End if
sYYYYYMMHHMMSS = "********" & sHH & sMM & "00.000000"
'Сборка времени запуска задания
sStartTime = sYYYYYMMHHMMSS & sOOO
'Создание объекта планировщика
Set oJob = oWMIService.Get("Win32_ScheduledJob")
'Установка задания
errJobCreated = oJob.Create (sCommand, sStartTime, False , , , true, JobID)
'help for method Create(Command, Time, RunRepeatedly, DaysOfWeek to run,DaysOfMonth to run, InteractWithDesktop, JobID)
'Проверка результата установки задания
If errJobCreated = 0 then
ATCommand = "The job was successfully set on " & sComputer
Else
ATCommand = "Error! The job has not been set."
End if




© OSzone.net 2001-2012