Что нового

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

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Есть несколько десятков компов, все в разных концах области, есть доступ в администраторскую учетку каждого компа. Т.к. на другом конце, конечные пользователи недалеки умом, они могут легко начать удалять ПО, ставить игры и тд и тп. Для этого ПО настраивается заранее, далее ПК перелогинивается в Пользователя, пользователь настраивается как дефолтная учетка, всё работает. Временами есть необходимость удаленно в автоматизированном режим устанавливать\удалять ПО, менять конфиги программ и тд и тп.

Для этого написан маленький скрипт, который мониторит фтп сервер, и если находит там архив, скачивает, разархивирует и запускает лежащий там exe файл автоита, который далее разруливает ситуацию. Проблема в том что этому файлу нужно например поставить ПО, которое требует права администратора. пробовал RunAs, не работает, пробовал отключить запрос пароля через планировщик - не работает. Какие варианты?

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

Спасите помогите :smile:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А на компах вообще работает "Запуск от имени другого пользователя" для любого приложения?
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Да, работает. Проблема решена:
Код:
If Not IsAdmin() Then
	MsgBox(0,0,"Ниадмин")
	RunAs("server", @ComputerName, "123", 0, "C:\ПО\Deploy.exe")
	Exit
Else
	MsgBox(0,0,"Админ")
EndIf


Видимо просто после 12 часов кодинга, я окосевшим взглядом не заметил что что-то сделал не так, пару часов поспал и все взлетело.
Кстати работает даже если функция "запустить от имени", выключена. Ну то есть есть один комп, на котором когда жмешь на программу которая требует прав администратора, выводится не запрос на пароль, а сообщение с ошибкой "Вы должны быть администратором чтобы запустить это ПО".
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Поднимаю тему снова. Описанный мною выше способ отказывается работать.
Как не давая юзеру пароль админа и возможность редактировать настройки компьютера (сетевые например, или устанавливать программы), дать возможность скрипту запускаться без запроса пароля администратора?
 

qqww22

Новичок
Сообщения
115
Репутация
4
Создать дочку с логином и паролем,которая запустить команду с правами админа.
Применение статических сетевых настроек:

netsh interface ip set address "Подключение по локальной сети" static 213.108.213.117 255.255.255.240 213.108.213.113
netsh interface ip set dnsservers "Подключение по локальной сети" static 213.108.208.2
netsh interface ip add dnsservers "Подключение по локальной сети" 213.108.209.2
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Я даже через cmd не могу запустить :(
Код:
C:\Users\ххх>runas /user:321 "C:\ПО\Deploy.exe"
Введите пароль для 321:
Попытка запуска C:\ПО\Deploy.exe от имени пользователя "TEST\321" ...
ОШИБКА RUNAS: Не удается запустить - C:\ПО\Deploy.exe
740: Запрошенная операция требует повышения.



Добавлено:
Сообщение автоматически объединено:

Единственный пока из возможных вариантов: Отключение UAC, полное. В таком случае юзер не сможет редактировать например настройки сети (самое важное). Но сможет запустить любую программу от админа :(
 

qqww22

Новичок
Сообщения
115
Репутация
4
Включи локального админа :smile: и запускай от него.

Код:
If not IsAdmin() Then
  
учётку локального админа и скомпилируй а то запустит au3.
RunAS("LOCALADMIM","DOMAIN","PASSWORD",1,@ScriptFullPath)

endif



;~ автор CreatoR
;~ Gui настройки сети
#include <GuiConstants.au3>
#include <GuiIPAddress.au3>
#include <Misc.au3>

Global $i

$GUI_SET = GUICreate("Set IP address", 500, 270, -1, -1)
; --- Group -----
$Group1 = GUICtrlCreateGroup("LAN", 10, 10, 230, 190)
$Group2 = GUICtrlCreateGroup("Wi-Fi", 260, 10, 230, 190)
; --- Labals ----
$Label_3 = GUICtrlCreateLabel("Now is :", 20, 40, 40, 20)
$Label_19 = GUICtrlCreateLabel("Now is :", 270, 40, 60, 20)
$Label_13 = GUICtrlCreateLabel("IP", 20, 100, 60, 20)
$Label_14 = GUICtrlCreateLabel("Subnet", 20, 130, 60, 20)
$Label_15 = GUICtrlCreateLabel("Gateway", 20, 160, 60, 20)
$Label_23 = GUICtrlCreateLabel("IP", 270, 100, 60, 20)
$Label_24 = GUICtrlCreateLabel("Subnet", 270, 130, 70, 20)
$Label_25 = GUICtrlCreateLabel("Gateway", 270, 160, 60, 20)
; --- Radios ----
$DhcpLan = GUICtrlCreateRadio("DHCP", 130, 70, 70, 20)
$SetLan = GUICtrlCreateRadio("Set manually", 20, 70, 80, 20)
$DhcpWan = GUICtrlCreateRadio("DHCP", 380, 70, 70, 20)
$SetWan = GUICtrlCreateRadio("Set manually", 270, 70, 80, 20)
; --- Actual IP ----
$IpLanIs = _GUICtrlIpAddress_Create($GUI_SET, 70, 40, 140, 20)
_GUICtrlIpAddress_Set($IpLanIs, @IPAddress1)
$IpWanIs = _GUICtrlIpAddress_Create($GUI_SET, 320, 40, 140, 20)
_GUICtrlIpAddress_Set($IpWanIs, @IPAddress2)
; --- Settings IP ----
$IpLanSet = _GUICtrlIpAddress_Create($GUI_SET, 70, 100, 140, 20)
$SubLan = _GUICtrlIpAddress_Create($GUI_SET, 70, 130, 140, 20)
$GatLan = _GUICtrlIpAddress_Create($GUI_SET, 70, 160, 140, 20)

$IpWanSet = _GUICtrlIpAddress_Create($GUI_SET, 320, 100, 140, 20)
$SubWan = _GUICtrlIpAddress_Create($GUI_SET, 320, 130, 140, 20)
$GatWan = _GUICtrlIpAddress_Create($GUI_SET, 320, 160, 140, 20)

; --- buttons ----
$Set_IP = GUICtrlCreateButton("Set IP", 200, 220, 100, 30)
$Refresh = GUICtrlCreateButton("Refresh", 50, 220, 100, 30)
$Exit = GUICtrlCreateButton("Exit", 350, 220, 100, 30)
;
$StoredIpWanSet = "" ; a record of the last ip value read from the $IpWanSet
$StoredIpLanSet = "" ; a record of the last ip value read from the $IpLanSet
GUISetState()

While 1
    Sleep(20)
    
    $nMsg = GUIGetMsg()
    
    Select
        Case $nMsg = $GUI_EVENT_CLOSE Or $nMsg = $Exit Or _IsPressed("1B")
            ExitLoop
        Case $nMsg = $Refresh
            _Refresh()
        Case GUICtrlRead($SetLan) = 1 And $Set_IP = $nMsg
            $IpLanSeti = _GUICtrlIpAddress_Get($IpLanSet)
            $SubLani = _GUICtrlIpAddress_Get($SubLan)
            $GatLani = _GUICtrlIpAddress_Get($GatLan)
            RunWait(@ComSpec & " /c netsh interface ip set address " & Chr(34) & _Lanlang(1) & Chr(34) & " static " & $IpLanSeti & " " & $SubLani & " " & $GatLani & " 0", "", @SW_HIDE)
            MsgBox(32, "Done", "Your LAN is now Set !")
            _Refresh()
        Case GUICtrlRead($DhcpLan) = 1 And $Set_IP = $nMsg
            RunWait(@ComSpec & " /c netsh interface ip set address " & Chr(34) & _Lanlang(1) & Chr(34) & " dhcp", "", @SW_HIDE)
            MsgBox(32, "Done", "Your LAN is now in DHCP !")
            _Refresh()
        Case GUICtrlRead($SetWan) = 1 And $Set_IP = $nMsg
            $IpWanSeti = _GUICtrlIpAddress_Get($IpWanSet)
            $SubWani = _GUICtrlIpAddress_Get($SubWan)
            $GatWani = _GUICtrlIpAddress_Get($GatWan)
            RunWait(@ComSpec & " /c netsh interface ip set address " & Chr(34) & _Lanlang(0) & Chr(34) & " static " & $IpWanSeti & " " & $SubWani & " " & $GatWani & " 0", "", @SW_HIDE)
            MsgBox(32, "Done", "Your Wi-Fi is now Set !")
            _Refresh()
        Case GUICtrlRead($DhcpWan) = 1 And $Set_IP = $nMsg
            RunWait(@ComSpec & " /c netsh interface ip set address " & Chr(34) & _Lanlang(0) & Chr(34) & " dhcp", "", @SW_HIDE)
            MsgBox(32, "Done", "Your Wi-Fi is now in DHCP !")
            _Refresh()
        Case Not _GUICtrlIpAddress_IsBlank($IpWanSet)
            If GUICtrlRead($SetWan, $GUI_UNCHECKED) And $i = 0 Then
                $i = 1
                GUICtrlSetState($SetWan, $GUI_CHECKED)
            EndIf
            _GUICtrlIpAddress_Set($SubWan, "255.255.255.0")
            $lastIpWanSet = _GUICtrlIpAddress_Get($IpWanSet)
            If $lastIpWanSet <> $StoredIpWanSet Then
                _GUICtrlIpAddress_Set($GatWan, $lastIpWanSet)
                $StoredIpWanSet = $lastIpWanSet
            EndIf
        Case Not _GUICtrlIpAddress_IsBlank($IpLanSet)
            If GUICtrlRead($SetLan, $GUI_UNCHECKED) And $i = 0 Then
                $i = 1
                GUICtrlSetState($SetLan, $GUI_CHECKED)
            EndIf
            _GUICtrlIpAddress_Set($SubLan, "255.255.255.0")
            $lastIpLanSet = _GUICtrlIpAddress_Get($IpLanSet)
            If $lastIpLanSet <> $StoredIpLanSet Then
                _GUICtrlIpAddress_Set($GatLan, $lastIpLanSet)
                $StoredIpLanSet = $lastIpLanSet
            EndIf
    EndSelect
WEnd

Exit

;MsgBox(0, "Your OS Language:", _Lanlang())

Func _Lanlang($LAN)
    Select
        Case StringInStr("0409,0809,0c09,1009,1409,1809,1c09,2009,2409,2809,2c09,3009,3409", @OSLang);english
            If $LAN = 0 Then
                Return "Wireless Network Connection"
            Else
                Return "Local Area Connection"
            EndIf
        Case StringInStr("040c,080c,0c0c,100c,140c,180c", @OSLang); frensh
            If $LAN = 0 Then
                Return "Connexion rйseau sans fil"
            Else
                Return "Connexion au rйseau local"
            EndIf
        Case Else
            Return "Other (can't determine with @OSLang directly)"
    EndSelect
EndFunc

Func _Refresh()
    $i = 0
    GUICtrlSetState($DhcpLan, $GUI_UNCHECKED)
    GUICtrlSetState($SetLan, $GUI_UNCHECKED)
    GUICtrlSetState($DhcpWan, $GUI_UNCHECKED)
    GUICtrlSetState($SetWan, $GUI_UNCHECKED)
    _GUICtrlIpAddress_Set($IpLanIs, @IPAddress1)
    _GUICtrlIpAddress_Set($IpWanIs, @IPAddress2)
    _GUICtrlIpAddress_ClearAddress($IpLanSet)
    _GUICtrlIpAddress_ClearAddress($SubLan)
    _GUICtrlIpAddress_ClearAddress($GatLan)
    _GUICtrlIpAddress_ClearAddress($IpWanSet)
    _GUICtrlIpAddress_ClearAddress($SubWan)
    _GUICtrlIpAddress_ClearAddress($GatWan)
EndFunc
 

op_joke

Новичок
Сообщения
20
Репутация
0
Belfigor
Дык а в планировщике виндовом есть запуск от имени пользователя, может так?
Либо разделить права, если домен к примеру
Еще можно запустить CMD от админа, и через командную строку запустить программу/скрипт, я так давече делал, в одной конторке у меня то же похожая проблема была. Я там обновления на часовой пояс накатывал так.

Код:
; Параметры учетной записи
    Local $sUserName = "UserName"
    Local $sPassword = "Password"
	Local $sDomain = "Domain"

	; Команда для CMD
	Local $sCMD = @ComSpec & " /c " & 'wusa.exe \\10.10.10.1\softdistrib\updtime\Windows6.1-KB2998527-x86.msu' & ' /quiet /norestart'
	;Local $sTemp = Run(@ComSpec & " /c wusa.exe \\10.10.10.1\softdistrib\updtime\Windows6.1-KB2998527-x86.msu" & '', "")

    ; Запуск CMD от имени Администратора, вставка команды
    RunAs($sUserName, $sDomain, $sPassword, 0, $sCMD, "", @SW_HIDE)
 

medvedi244

Новичок
Сообщения
11
Репутация
0
op_joke сказал(а):
Belfigor
Дык а в планировщике виндовом есть запуск от имени пользователя, может так?....

На машинах действительно был включён UAC? При включенном UAC такое не прокатит. По крайней мере у меня нет, но я запускал не при помощи AutoIT, а при помощи CPAU и вроде powershell (было давно, точно не помню ). При запуске cmd с правами админа и при помощи него запустить .exe,.bat или .bat который запускает .exe должен выдать запрос UAC.
Планировщик отпадает.... Но думаю что скоро от безысходности буду им заманить.
 

op_joke

Новичок
Сообщения
20
Репутация
0
medvedi244 сказал(а):
На машинах действительно был включён UAC?
Конечно, домен же, около сотни машин, тогда помню через политики не вышло, пришлось через скрипт делать. Скрипт собственно, рабочий и выложил
 
Сообщения
15
Репутация
-1
А как без домена на 1 ной машине локальную прогу выполнить ? c:\user\123.exe
Но зная логин и пароль пользователя? именно от нужного юзера
 
Верх