PDA

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


DjBoBo
23-07-2016, 12:13
У меня уже мозг взрывается над следующей задачей:
Мне необходимо запускать программу с правами администратора в ограниченной учётной записи, причём из автозагрузки. Проблема в том, что служба «seclogon» не успевает прогрузиться и скрипт, в котором происходит запуск программы через RunAs не срабатывает.
Может есть команда для Bat, Vbs, Autoit, которая может исполняться в ограниченной учётной записи, которая бы отслеживала подгрузку службы seclogon и только после этого продолжала работу?
Рекомендация использовать паузу не оптимальна, хотелось бы запуск именно как только это становится возможным. И через планировщик тоже не вариант запускать т.к. он вырезан в той сборке Windows XP, которая используется.

Iska
23-07-2016, 12:58
Проблема в том, что служба «seclogon» не успевает прогрузиться и скрипт, в котором происходит запуск программы »
Что мешает сделать в скрипте ожидание запуска службы или её непосредственный запуск?

через RunAs »
Никогда не делайте так. Это огромная дыра в безопасности. Если уж никак иначе нельзя — используйте что-нибудь наподобие AdmiLink & AdmiRun (http://admilink.narod.ru/admilink.htm) и т.п.

DjBoBo
23-07-2016, 15:13
Вызов команды net start seclogon из под ограниченной учётной записи вываливается с ошибкой по причине нехватки прав, в учётной записи администратора команда отрабатывается и действительно ждёт запуска службы. Но мне необходима реализация именно из под ограниченной учётной записи.
А ожидание старта сервиса какой командой делается и будет ли оно работать в учётной записи с ограниченными правами? Я активно гуглил, но ничего такого так и не встретил.
И я использую не чисто RunAs, а приложение cpau, но эта утилита и ей подобные программы всё равно не будут работать, пока системная служба seclogon не будет запущена.
--- Дополнение---
Я тут в очередной раз поискал команду, которая бы ждала запуска службы, но такой команды вроде как нет. Но я подумал над скриптом, который бы мог работать в ограниченной учётной записи со следующим финтом:
--- Отслеживать в памяти раз в секунду имя запускаемой программы (program.exe)
------- её нет? Тогда запускаем команду cpau -dec -lwp -file C:\start-program.job (это контейнер с зашифрованными логином и паролем, а также расположением запускаемого файла для runas)
------------- программа (program.exe) не появилась через 3 секунды? Тогда убиваем процесс cpau.exe и вновь переходим к отслеживанию.
--- программа появилась в оперативной памяти? Завершаем работу скрипта.

Пояснение про 3 секунды после старта cpau: после запуска в случае успешной подгрузки службы «seclogon» практически моментально стартует заданную программу с правами админа, а если в момент запуска служба всё ещё недоступна, то она будет висеть и к моменту прогрузки службы выдаст ошибку.

Вот только моих любительских знаний не хватит для написания такого скрипта. Буду признателен за помощь .

Опиум
25-07-2016, 19:44
Попробуй в цикле команду
C:\Users\administrator>sc query seclogon

SERVICE_NAME: seclogon
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0


и проверяй STATE.
возможно она не требует админских прав.

megaloman
26-07-2016, 10:25
DjBoBo, "Тупо" реализовал Ваш алгоритм в Дополнении в vbsProg1 = "program.exe"
Prog2 = "cpau -dec -lwp -file C:\start-program.job"

Time1 = 1 * 1000 ' Время 1 паузы (1 сек)
Time2 = 3 * 1000 ' Время 1 паузы (3 сек)

Set WMI = GetObject("winMgmts:")
Set WShell = CreateObject("WScript.Shell")

SQuery1 = "Select *From Win32_Process Where Name=" + """" + Prog1 + """"
SQuery2 = "Select *From Win32_Process Where Name=" + """" + Prog2 + """"

WScript.Sleep Time1

Do
Set Proc2 = WMI.ExecQuery(SQuery2)

For Each Process In Proc2 ' Убиваем вторую
Process.Terminate
Next

Set Proc1 = WMI.ExecQuery(SQuery1)
If Proc1.Count = 0 Then ' Если нет первой программы
Sending = WShell.Run(Prog2, 2, False) ' Запускаем вторую
Else
Exit Do
End If

WScript.Sleep Time2
Loop Обратите внимание, что программы указаны без путей. Если для запуска надо пути, их придётся добавить к именам программ при вызове в методе Run




© OSzone.net 2001-2012