Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Запуск скрипта от имени определенного пользователя (http://forum.oszone.net/showthread.php?t=164842)

NewOLDi 27-01-2010 11:28 1331196

Запуск скрипта от имени определенного пользователя
 
Здравствуйте.

Мне нужно, чтобы откомпилированный в EXE'шник AutoIt-скрипт запускался от имени определённого пользователя с его паролем. Главное, чтобы кроме самого EXE-шника небыло больше никаких дополнительных файлов (ярлыков) и манипуляций (BAT'ники, ручной ввод данных), всё должен делать он один, т.е. имя и пароль надо зашить в него!

В AutoIt есть замечательная возможность под именем RunAsSet, но это мне не подходит, т.к. помимо Run и RunWait (для которых эта функция собственно и предназначена), в моём скрипте также используются функции для редактирования реестра (RegDelete и т.п.) и идёт работа с файлами в системных директориях (FileDelete и т.д.).

Может есть программа, которая способна "зашить" в EXE'шник имя/пароль?

Спасибо.

kaster 27-01-2010 11:45 1331222

NewOLDi, В версиях AutoIt начиная с v3.2.12.0 уже нет такой функции как RunAsSet, вместо нее теперь есть две функции - RunAs и RunAsWait. но это не по сути немного. эти команды предназначены для запуска других приложений ИЗ самого скрипта, и к запуску самого скрипта как такового отношения не имеют. для решения твоего вопроса, мне представляется вероятнее всего такой вариант - нужно крутить тот инструмент, который запускает скрипт. например создать групповую политику. из самого скрипта, скорее всего, такое делать нельзя.

amel27 27-01-2010 11:47 1331227

NewOLDi, пусть скрипт сам запускает сам себя с нужными правами, например:

- при запуске скрипта проверяем параметры командной строки;
- если параметров нет, значит это первый запуск, делаем RunAs самого себя с к-л параметром и выход;
- если обнаружен нужный параметр, значит это уже рабочий запуск - переходим выполнению основного кода

пример: http://forum.oszone.net/post-889794-831.html

NewOLDi 28-01-2010 11:06 1332152

amel27, не понял... как выполняющийся скрипт может запустить сам себя? дайте простой пример пожалуйста!

kaster 28-01-2010 11:40 1332184

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

Только скрипт должен быть откомпилирован перед запуском

NewOLDi 28-01-2010 11:53 1332199

kaster, да это я уже понял :) мне не разобраться, как получить этот $CmdLine[0] :)

Вот пример моего кода, осталось только разобраться как получить $CmdLine[0]:
PHP код:

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]?

amel27 28-01-2010 12:05 1332214

NewOLDi, $CmdLine[0] возвращает количество параметров
Код:

If $CmdLine[0]=0 Then Exit RunAs("User", @ComputerName, "password", 0, @ScriptFullPath &" process", @ScriptDir)

; тело скрипта
MsgBox(0, 'Сообщение', 'Скрипт запущен под пользователем '& @UserName)


NewOLDi 28-01-2010 12:28 1332233

Всем большое спасибо за помощь, во всём разобрался, всё получилось!!!

Вот рабочий код, на всякий случай:
PHP код:

If $CmdLine[0Then
    Run 
'C:\WINDOWS\pchealth\helpctr\binaries\msconfig.exe' )
Else
    
RunAs 'Administrator''''1234567890'1, @ScriptName ' param' )
EndIf 

Что касается $CmdLine, то я элементарно не знал, что это служебное слово AutoIt. Я думал, что $ подразумевает под собой определение пользовательской переменной, как в PHP :)

NewOLDi 29-01-2010 22:01 1333876

Уходя дальше - столкнулся с проблемой...

План действий такой:
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 пункт выполняется неверно, а именно - он выполняется от учётки Админа (т.е. один раз выполнившись от Админа - скрипт и впредь от этого имени фигачит)! Как его выполнить от учётной записи текущего пользователя (без явного указания имени/пароля)?

amel27 01-02-2010 04:23 1335595

Цитата:

Цитата NewOLDi
Как его выполнить от учётной записи текущего пользователя »

Не завершать первый запуск скрипта, пока не будут выполнены все задачи под пользователем.

Перепланируйте задачу так, чтобы первый запуск скрипта был главным, и единственным запуском под пользователем, а все админские запуски выполнялись из него, например так:
Код:

; Описание всех админских процедур
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' )


NewOLDi 01-02-2010 12:33 1335815

Этот вариант работает, благодарю! :)


Время: 18:54.

Время: 18:54.
© OSzone.net 2001-