找回密码
 加入
搜索
查看: 3911|回复: 4

[系统综合] 添加系统用户

[复制链接]
发表于 2010-4-26 14:23:56 | 显示全部楼层 |阅读模式
本帖最后由 woeiwoei 于 2010-4-29 10:07 编辑

耽搁大侠时间了。有个问题想问下:
_LsaAddLocalUser($sUser,$sPswd,$iFlag = 0,$sSystem = '')
创建了一个用户。但是不明白 创建后为什么 隶属于 那一栏是空的?
请教大侠大作中的 $ifag=0 和$ssystem='' 都是代表啥意思?
大家别嘲笑我啊,本人菜鸟~~正在认真学习当中~~
嘿嘿。这个 LocalSecurityAuthority.au3太强大了~~
 楼主| 发表于 2010-4-26 17:50:48 | 显示全部楼层
汗。。沉的这么快~~
发表于 2010-4-29 16:37:00 | 显示全部楼层
本帖最后由 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
能否再修改下标题呢?没注意到这里是提问区的人还以为你在展示源码。

评分

参与人数 1贡献 +10 收起 理由
afan + 10 辛苦了

查看全部评分

 楼主| 发表于 2010-4-30 14:08:29 | 显示全部楼层
$iFlags - 指定用户的初始状态,32位,每一位都代表着用户的一个属性状态,可以是以下值的组合:关于各常量 ...
pusofalse 发表于 2010-4-29 16:37

经典!!!!
发表于 2010-4-30 22:45:49 | 显示全部楼层
用dos令命!!!!!!!!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-20 14:20 , Processed in 0.084630 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表