Показать полную графическую версию : Запуск скрипта от имени определенного пользователя
Здравствуйте.
Мне нужно, чтобы откомпилированный в EXE'шник AutoIt-скрипт запускался от имени определённого пользователя с его паролем. Главное, чтобы кроме самого EXE-шника небыло больше никаких дополнительных файлов (ярлыков) и манипуляций (BAT'ники, ручной ввод данных), всё должен делать он один, т.е. имя и пароль надо зашить в него!
В AutoIt есть замечательная возможность под именем RunAsSet, но это мне не подходит, т.к. помимо Run и RunWait (для которых эта функция собственно и предназначена), в моём скрипте также используются функции для редактирования реестра (RegDelete и т.п.) и идёт работа с файлами в системных директориях (FileDelete и т.д.).
Может есть программа, которая способна "зашить" в EXE'шник имя/пароль?
Спасибо.
NewOLDi, В версиях AutoIt начиная с v3.2.12.0 уже нет такой функции как RunAsSet, вместо нее теперь есть две функции - RunAs и RunAsWait. но это не по сути немного. эти команды предназначены для запуска других приложений ИЗ самого скрипта, и к запуску самого скрипта как такового отношения не имеют. для решения твоего вопроса, мне представляется вероятнее всего такой вариант - нужно крутить тот инструмент, который запускает скрипт. например создать групповую политику. из самого скрипта, скорее всего, такое делать нельзя.
NewOLDi, пусть скрипт сам запускает сам себя с нужными правами, например:
- при запуске скрипта проверяем параметры командной строки;
- если параметров нет, значит это первый запуск, делаем RunAs самого себя с к-л параметром и выход;
- если обнаружен нужный параметр, значит это уже рабочий запуск - переходим выполнению основного кода
пример: http://forum.oszone.net/post-889794-831.html
amel27, не понял... как выполняющийся скрипт может запустить сам себя? дайте простой пример пожалуйста!
amel27, браво :) как всегда изящнее решение.
NewOLDi, имеется в виду два разных сценария запуска. один с параметрами ком. строки, другой без. если нет параметра значит скрипт запустился из скрипта-же. вот пример
$username = 'user'
$domain = 'domain'
$pass = 'password'
$logon = 0; 1,2,4
If CmdLine[0] Then
RunAs($username, $domain, $pass, $logon, @ScriptFullPath)
Else
; Основное тело скрипта
EndIf
Только скрипт должен быть откомпилирован перед запуском
kaster, да это я уже понял :) мне не разобраться, как получить этот $CmdLine[0] :)
Вот пример моего кода, осталось только разобраться как получить $CmdLine[0]:
If $CmdLine[0] == 'param' Then
Run ( 'C:\WINDOWS\pchealth\helpctr\binaries\msconfig.exe' )
Else
RunAs ( 'Administrator', '', '1234567890', 1, 'test.exe param' )
EndIf
msconfig.exe не запустится без прав админа, это так, к слову и для удобства эксперимента...
PS: Да, amel27, действительно гениально и просто, огромное спасибо!
Как получить $CmdLine[0]?
NewOLDi, $CmdLine[0] возвращает количество параметров
If $CmdLine[0]=0 Then Exit RunAs("User", @ComputerName, "password", 0, @ScriptFullPath &" process", @ScriptDir)
; тело скрипта
MsgBox(0, 'Сообщение', 'Скрипт запущен под пользователем '& @UserName)
Всем большое спасибо за помощь, во всём разобрался, всё получилось!!!
Вот рабочий код, на всякий случай:
If $CmdLine[0] Then
Run ( 'C:\WINDOWS\pchealth\helpctr\binaries\msconfig.exe' )
Else
RunAs ( 'Administrator', '', '1234567890', 1, @ScriptName & ' param' )
EndIf
Что касается $CmdLine, то я элементарно не знал, что это служебное слово AutoIt. Я думал, что $ подразумевает под собой определение пользовательской переменной, как в PHP :)
Уходя дальше - столкнулся с проблемой...
План действий такой:
1. Запуск скрипта ПОД ТЕКУЩЕЙ УЧЁТКОЙ ПОЛЬЗОВАТЕЛЯ!!!.
2. Запуск скрипта под учёткой Админа.
3. Запуск скрипта ПОД ТЕКУЩЕЙ УЧЁТКОЙ ПОЛЬЗОВАТЕЛЯ!!!.
Вот код, который это должен делать:
If $CmdLine[0] Then
Select
Case $CmdLine[1] == '1'
Exit Run ( @ScriptDir & '\' & @ScriptName & ' 2' )
Case $CmdLine[1] == '2'
FileWrite ( '\\сетевой путь + имя файла' )
EndSelect
Else
Exit RunAs ( 'Administrator', '', 'пароль', 1, @ScriptDir & '\' & @ScriptName & ' 1' )
EndIf
Выполняются 1 и 2 пункты. 3 пункт выполняется неверно, а именно - он выполняется от учётки Админа (т.е. один раз выполнившись от Админа - скрипт и впредь от этого имени фигачит)! Как его выполнить от учётной записи текущего пользователя (без явного указания имени/пароля)?
Как его выполнить от учётной записи текущего пользователя »
Не завершать первый запуск скрипта, пока не будут выполнены все задачи под пользователем.
Перепланируйте задачу так, чтобы первый запуск скрипта был главным, и единственным запуском под пользователем, а все админские запуски выполнялись из него, например так:
; Описание всех админских процедур
If $CmdLine[0] Then
Select
Case $CmdLine[1] == '1'
MsgBox(0, 'Сообщение', 'Процедура 1 запущена под пользователем '& @UserName)
Exit 0
Case $CmdLine[1] == '2'
MsgBox(0, 'Сообщение', 'Процедура 2 запущена под пользователем '& @UserName)
Exit 0
Case Else
Exit -1
EndSelect
EndIf
; Запуск процедуры 1 по админом
RunAsWait ( 'Administrator', @ComputerName, 'пароль', 1, @ScriptDir & '\' & @ScriptName & ' 1' )
; Выполнение команды под пользователем
FileWrite ( '\\сетевой путь\имя файла1' )
; Запуск процедуры 2 по админом
RunAsWait ( 'Administrator', @ComputerName, 'пароль', 1, @ScriptDir & '\' & @ScriptName & ' 2' )
; Выполнение команды под пользователем
FileWrite ( '\\сетевой путь\имя файла2' )
Этот вариант работает, благодарю! :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.