Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Lodoss
Вот рабочий (у меня) вариант (в нём уже включено помещение списка юзеров в combo) :

Код: Выделить весь код
#include <Array.au3>
#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)

;Узнаём список пользователей
$admins = _AdminUsers()

Dim $AdminList
;Подготавливаем список пользователей для использования в combo
If IsArray($admins) Then
   For $i = 1 to $admins[0]
	   Do 
		   $AdminList = $admins[$i] & "|" & $AdminList
	   Until $admins[$i] <> $admins[0]
   Next
EndIf

;что запускать
$what_to_run="setup.exe"

If IsAdmin() Then
    ;запуск программы
    Run($what_to_run)
Else
    ;если не админ, то "рисуем" GUI
    _GUI()
EndIf

Func _GUI()
    GUICreate("Авторизация", 198, 125)
     ;фон окна
    GUISetBkColor (0x00E0FFFF)
    ;лейблы
    GUICtrlCreateLabel("Имя администратора", 25, 5)
    GUICtrlCreateLabel("Пароль администратора", 25, 50)
    ;запуск и отмена скрипта
    $ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
    $cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
    ;ввод имени
    $us = @UserName
    $in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
    GUICtrlSetData($in1, $AdminList)
    GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
    ;ввод пароля
    $in2 = GUICtrlCreateInput ("",  25, 70, 150, 20, 0x20)
    GUICtrlSetTip(-1,"введите пароль")
    GUISetState(@SW_SHOW)

    While 1
        $msg = GUIGetMsg()
        ;считываем введённые данные
        $User = GUICtrlRead($in1)
        $Password = GUICtrlRead($in2)

		Select
			Case $msg = $ok
				;Проверка был ли введён пароль вообще
				If $Password = "" Then
					MsgBox(48, "Ошибка", "Не был введён пароль")
					ContinueLoop
				EndIf
				
				;инициализация запуска от имени админа
				RunAsSet($User, "", $Password)
				;проверка верны ли введённые записи на право обладания правами админа
				If IsAdmin() Then
					;запуск программы
					Run($what_to_run)
					
					If @error Then
						MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
						ContinueLoop
					EndIf
					Exit
				EndIf
            ;закрытие окна
            Case $msg = $cancel or $msg = $GUI_EVENT_CLOSE
				ExitLoop
        EndSelect
    WEnd
EndFunc

; Возвращает массив со счетчиком - состав локальной группы "Администраторы"
Func _AdminUsers()
	Local $i, $res [1] = [0]
	; читаем состав группы
	Local $members = _NetLocalGroupGetMembers (@ComputerName, 'Администраторы')
	; проверка на ошибки
	If @error Then
		MsgBox (16, 'Ошибка выполнения', 'Код ошибки:' & @error)
		Exit
	EndIf
	If $members [0] >0 Then
		; фильтруем только локальные учетные записи
		For $i=1 To $members [0]
			If StringRegExp ($members [$i], '^' & @ComputerName & '\\') Then
				ReDim $res [$res[0]+2]
				$res [0] = $res [0]+1
				$res [$res[0]] = StringRegExpReplace ($members [$i], '^' & @ComputerName & '\\', '')
			EndIf
		Next
	EndIf
	Return $res
EndFunc

; Возвращает массив со счетчиком- состав локальной группы произвольного компьютера
Func _NetLocalGroupGetMembers($server, $group)
	Local $i, $string, $res [1] = [0], $pointer= DllStructCreate ("ptr")
	; Выполняем запрос к базе SAM
 	Local $ret = DllCall ("netapi32.dll", "int", "NetLocalGroupGetMembers", _
		"wstr", "\\" & StringRegExpReplace ($server, '^\\+', ''), _
		"wstr", $group, _
		"int", 3, _
		"ptr", DllStructGetPtr ($pointer), _
		"int", -1, _
		"int_ptr", 0, _
		"int_ptr", 0, _
		"int_ptr", 0 )
	; Если произошла ошибка, то выход с кодом ошибки
	If $ret[0]>0 Then
		SetError ($ret)
		Exit
	EndIf
	; Если есть результат, то обрабатываем каждый отдельно
	If $ret[6]>0 Then
		Local $buffer = DllStructCreate ("ptr[" & $ret[6] & "]", DllStructGetData ($pointer,1) )
		For $i=1 To $ret[6]
			$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
				"int", 0, _
				"int", 0, _
				"ptr", DllStructGetData ($buffer, 1, $i), _
				"int", -1, _
				"str", "", _
				"int", 0, _
				"int", 0, _
				"int", 0 )
			$string = DllStructCreate("char[" & $ret[0] & "]")
			$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
				"int", 0, _
				"int", 0, _
				"ptr", DllStructGetData ($buffer, 1, $i), _
				"int", -1, _
				"ptr", DllStructGetPtr ($string), _
				"int", $ret[0], _
				"int", 0, _
				"int", 0 )
			ReDim $res [$res[0]+2]
			$res [0] = $res [0]+1
			$res [$res[0]] = DllStructGetData ($string,1)
		Next
	EndIf
	; Чистим временные системные структуры
	DllCall ("netapi32.dll", "int" ,"NetApiBufferFree", _
		"ptr" , DllStructGetData ($pointer,1) )
	Return $res
EndFunc

Отправлено: 09:34, 17-11-2006 | #480