Что нового

Как создать пользователя через WinApi

imperia

Новичок
Сообщения
1
Репутация
0
Прошу помочь создать пользователя через WinApi...
Другие способы прошу не предлогать (net user /add, через wmi, и т.д.)
В WinApi я не очень силен... поэтому и прошу совета знающих людей как это сделать на Autoit
В WinApi существует функция NetUserAdd. Вот через нее и пытаюсь реализовать.. Примерно так:

Код:
Const $sServer = "Localhost"
Local $dError

$_USER_INFO_1 = DllStructCreate ( "WCHAR name; WCHAR Pass;  DWORD Pass2;  DWORD Priv; WCHAR Home; WCHAR Comment; DWORD Flag; WCHAR Path")

DllStructSetData($_USER_INFO_1,"name","TestWinApi")
DllStructSetData($_USER_INFO_1,"Pass","111")
DllStructSetData($_USER_INFO_1,"Pass2","")
DllStructSetData($_USER_INFO_1,"Priv","USER_PRIV_ADMIN")
DllStructSetData($_USER_INFO_1,"Home","")
DllStructSetData($_USER_INFO_1,"Comment","")
DllStructSetData($_USER_INFO_1,"Flag","UF_NORMAL_ACCOUNT")
DllStructSetData($_USER_INFO_1,"Path","")

DllCall("Netapi32.dll","DWORD","NetUserAdd","str",$sServer,"DWORD",1,"ptr",DllStructGetPtr($_USER_INFO_1),"DWORD",$dError)


После запуска скрипта ничего не происходит. Пользователь не добавляется. Предполагаю , что где-то ошибка
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
вот кое что нарыл в инете
Код:
Global Const $tagUSER_INFO_1 = " ptr usri1_name; ptr usri1_password; DWORD  usri1_password_age; DWORD  usri1_priv; ptr usri1_home_dir; ptr usri1_comment; DWORD  usri1_flags; ptr usri1_script_path;"

Global Const $UF_SCRIPT                               = 0x000001
Global Const $UF_ACCOUNTDISABLE                       = 0x000002
Global Const $UF_HOMEDIR_REQUIRED                     = 0x000008
Global Const $UF_LOCKOUT                              = 0x000010
Global Const $UF_PASSWD_NOTREQD                       = 0x000020
Global Const $UF_PASSWD_CANT_CHANGE                   = 0x000040
Global Const $UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED      = 0x000080
Global Const $UF_TEMP_DUPLICATE_ACCOUNT               = 0x000100
Global Const $UF_NORMAL_ACCOUNT                       = 0x000200
Global Const $UF_INTERDOMAIN_TRUST_ACCOUNT            = 0x000800
Global Const $UF_WORKSTATION_TRUST_ACCOUNT            = 0x001000
Global Const $UF_SERVER_TRUST_ACCOUNT                 = 0x002000
Global Const $UF_DONT_EXPIRE_PASSWD                   = 0x010000
Global Const $UF_MNS_LOGON_ACCOUNT                    = 0x020000
Global Const $UF_SMARTCARD_REQUIRED                   = 0x040000
Global Const $UF_TRUSTED_FOR_DELEGATION               = 0x080000
Global Const $UF_NOT_DELEGATED                        = 0x100000
Global Const $UF_USE_DES_KEY_ONLY                     = 0x200000
Global Const $UF_DONT_REQUIRE_PREAUTH                 = 0x400000
Global Const $UF_PASSWORD_EXPIRED                     = 0x800000
Global Const $UF_MACHINE_ACCOUNT_MASK = BitOr($UF_INTERDOMAIN_TRUST_ACCOUNT, $UF_WORKSTATION_TRUST_ACCOUNT, $UF_SERVER_TRUST_ACCOUNT)
Global Const $UF_ACCOUNT_TYPE_MASK = BitOr($UF_TEMP_DUPLICATE_ACCOUNT, $UF_NORMAL_ACCOUNT, $UF_INTERDOMAIN_TRUST_ACCOUNT, $UF_WORKSTATION_TRUST_ACCOUNT, $UF_SERVER_TRUST_ACCOUNT)
Global Const $UF_SETTABLE_BITS = BitOr($UF_SCRIPT, $UF_ACCOUNTDISABLE, $UF_LOCKOUT, $UF_HOMEDIR_REQUIRED, $UF_PASSWD_NOTREQD, $UF_PASSWD_CANT_CHANGE, $UF_ACCOUNT_TYPE_MASK, $UF_DONT_EXPIRE_PASSWD)

Global Enum $USER_PRIV_GUEST = 0, $USER_PRIV_USER = 1, $USER_PRIV_POWERUSER = 2, $USER_PRIV_ADMIN = 3

Func _Net_User_Add($sServername, $iLevel, $tInfo)
    ; Author: ProgAndy
    Local $sTypeServer = "ptr", $pInfo
    If IsString($sServername) And $sServername <> "" Then $sTypeServer = "wstr"
    If IsDllStruct($tInfo) Then
        $pInfo = DllStructGetPtr($tInfo)
    Else
        $pInfo = $tInfo
    EndIf
    Local $aRes = DllCall("netapi32.dll", "int", "NetUserAdd", $sTypeServer, $sServername, "dword", $iLevel, "ptr", $pInfo, "dword*", 0)
    If @error Then Return SetError(1, 0, False)
    Return SetError($aRes[0], $aRes[4], $aRes[0] = 0)
EndFunc

Func _Net_WStr_Create($sText)
    ; Author: ProgAndy
    Local $tString = DllStructCreate("wchar[" & (StringLen($sText)+1) & "]")
    DllStructSetData($tString, 1, $sText)
    Return $tString
EndFunc

;------ EXAMPLE -----

$tUSER_INFO_1 = DllStructCreate($tagUSER_INFO_1)

$tName = _Net_WStr_Create("Name")
DllStructSetData($tUSER_INFO_1, "usri1_name", DllStructGetPtr($tName))

$tPassword = _Net_WStr_Create("Password")
DllStructSetData($tUSER_INFO_1, "usri1_password", DllStructGetPtr($tPassword))

DllStructSetData($tUSER_INFO_1, "usri1_priv", $USER_PRIV_USER)

DllStructSetData($tUSER_INFO_1, "usri1_flags", BitOR($UF_SCRIPT, $UF_DONT_EXPIRE_PASSWD))


_Net_User_Add("", 1, $tUSER_INFO_1)

единственный косяк (мой) я не понял как активизировать учетку..сделал это потом вручную..учетка name не принадлежала ни к какой группе..средствами администрирования прикрепил учетку к группе администраторы, пользователи дебагюзеры и все сработало..
в принципе учетка получается скрытая как встроенный администратор. если отключить быстрый вход в систему ( отключить приветствие) , то можно набрать имя Name и пароль Password и загрузится новая учетка, которая была создана скриптом.
повторюсь, если добавить членство в группах для этой учетки она станет видимой
 
A

amee

Гость
Скажите , удалось ли завершить скрипт, что бы заведение пользователя, и его активация были в итоге выполнены?
 
Верх