本帖最后由 pusofalse 于 2010-4-29 17:06 编辑
$iFlags - 指定用户的初始状态,32位,每一位都代表着用户的一个属性状态,可以是以下值的组合:Const $UF_SCRIPT = 0x000001
Const $UF_ACCOUNTDISABLE = 0x000002
Const $UF_HOMEDIR_REQUIRED = 0x000008
Const $UF_LOCKOUT = 0x000010
Const $UF_PASSWD_NOTREQD = 0x000020
Const $UF_PASSWD_CANT_CHANGE = 0x000040
Const $UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED = 0x000080
Const $UF_TEMP_DUPLICATE_ACCOUNT = 0x000100
Const $UF_NORMAL_ACCOUNT = 0x000200
Const $UF_INTERDOMAIN_TRUST_ACCOUNT = 0x000800
Const $UF_WORKSTATION_TRUST_ACCOUNT = 0x001000
Const $UF_SERVER_TRUST_ACCOUNT = 0x002000
Const $UF_DONT_EXPIRE_PASSWD = 0x010000
Const $UF_MNS_LOGON_ACCOUNT = 0x020000
Const $UF_SMARTCARD_REQUIRED = 0x040000
Const $UF_TRUSTED_FOR_DELEGATION = 0x080000
Const $UF_NOT_DELEGATED = 0x100000
Const $UF_USE_DES_KEY_ONLY = 0x200000
Const $UF_DONT_REQUIRE_PREAUTH = 0x400000
Const $UF_PASSWORD_EXPIRED = 0x800000
关于各常量的说明,请参考http://msdn.microsoft.com/en-us/library/aa370968(v=VS.85).aspx
$sSystem - 指定计算机名称,函数将在此系统中创建账户。默认为在本地创建,如果指定了此参数,必须为UNC格式。
如果要在计算机名为“RemoteComputer”上创建一个名为test的用户,密码为空,初始状态为禁用,用以下代码:$pSid = _LsaAddLocalUser("test", "", 2, "\\RemoteComputer")
第3个参数2对应常量UF_ACCOUNTDISABLE,初始状态为禁用。
函数将返回test用户的SID指针,而不论之前test是否已经存在,要确定函数是否执行成功,查看@error的值,如果为2224,说明test在之前已经存在。
返回值$pSid为用户SID指针,如果要转换为字符型,调用_ConvertSidToStringSid函数;根据此SID获取对应的用户名称,调用_LookupAccountSid。
最后,当$pSid不再需要时,调用_HeapFree释放,这是很好的习惯,也是必须的,在测试过程中,如果不及时释放内存,会直接引发内存不能为read的严重错误。
新添加的用户不属于任何组,如果将之添加为管理员组,调用_LsaLocalGroupAddMembers,这个函数的作用就是向指定的用户组里面添加用户成员。_LsaLocalGroupAddMembers("Administrators", "test", "\\RemoteComputer")
\\RemoteComputer同_LsaAddLocalUser中的\\RemoteComputer。
如果函数执行成功,函数返回TRUE,否则为False,并设置@error为错误代码。
以上。
_LsaLocalGroupAddMembers的第一个参数指定用户组名称,上例中的administrators参数既是管理员组,另外的Guests是来宾组,在大多数情况下是这样的。要知道用户组是可以重命名的,如果某个变态的系统管理员将Administrators命名为Guests,将Guests命名为Administrators,上例中的代码虽不会出错,但会违背了你的初衷,你原本是想将test添加到管理员组,使其拥有管理员权限,但实际是来宾权限。为确保test是真正的管理员权限,必须多加一步_AllocateAndInitializeSid,这个函数的作用是分配内存以用来初始化用户SID。
虽然用户和用户组可以重命名,但他们的SID是不会随之改变的,一台系统中的用户SID是唯一的,由系统自动分配,即便你创建一个名为abcd的账户之后再将他删除,然后再次创建abcd账户,两者的SID还是不同。
另外Administrators和Guests、Power Users这样的用户组,属于系统内置的用户组,他们的SID都是已经确定的,每台计算机中,内置用户和内置用户组的SID都是一样的(要确定一台计算机中有多少内置用户和内置用户组,调用_LsaEnumerateWellKnownAccounts函数)。
在本地计算机中创建test用户,密码为空,初始状态为禁用,权限为管理员。代码如下:#include <LocalSecurityAuthority.au3>
$pSid = _LsaAddLocalUser("test", "", 2, "")
If (@error = 2224) Then Msgbox(48, "", "test's user account already exists.")
If ($pSid) Then _HeapFree($pSid) ; 释放SID。
; 因为管理员组的SID已经确定,可直接获取其SID。
$pAdminsSid = _AllocateAndInitializeSid(5, 32, $DOMAIN_ALIAS_RID_ADMINS)
$sAdminsGroup = _LookupAccountSid($pAdminsSid, "") ; 根据SID获取管理员组的名称。
$sAdminsGroup = StringTrimLeft($sAdminsGroup, StringInStr($sAdminsGroup, ""))
_FreeSid($pAdminsSid) ; 释放$pAdminsSid内存,已经不再需要。
$fResult = _LsaLocalGroupAddMembers($sAdminsGroup, "test", "")
If ($fResult) Then
Msgbox(0, "", "Done")
Else
Msgbox(48, "", "Error code: " & @error)
EndIf
能否再修改下标题呢?没注意到这里是提问区的人还以为你在展示源码。 |