[已解决]AU3判断指定的用户是否具有本机管理员权限的问题
本帖最后由 fuinei 于 2012-3-29 10:00 编辑各位好,请问使用AU3有哪些可以判断指定用户是否具有管理员权限的方法呢?
前几天在论坛中发现pusofalse大的UDF可实现这个功能,在测试过程中发现Autoit经常会报错,代码如下:#include <lsasecur.au3>
$isadmin = _SeIsUserAdminEx("abc")
If $isadmin = 1 Then
MsgBox(0,"info","abc在当前计算机管理员组中")
Else
MsgBox(48,"info","abc不在当前计算机管理员组中")
EndIf报错截图: 感谢测试,我现在才知道这个BUG,这是因为_SeIsUserAdminEx函数内部没有检查用户是否存在 而引发的错误。改用以下代码判断是否具有管理员权限:
#include <lsasecur.au3>
Const $USER_TEST = "abc"
Local $pSid = _SeLookupAccountName($USER_TEST)
If $pSid = 0 Then
MsgBox(48, "Error", _SeFormatMsg())
Exit
EndIf
Local $pAdminsSid = _SeGetWellKnownAccountSid($SE_WELLKNOWN_ADMINS)
Local $pDacl = _SeSetEntriesInAcl1($pAdminsSid, 1, $SE_GRANT_ACCESS, $SE_NO_INHERITANCE)
If _SeGetEffectiveRightsFromAcl($pDacl, $pSid) Then
MsgBox(48, "OK", StringFormat("'%s' is an administrator.", $USER_TEST))
Else
MsgBox(48, "OK", StringFormat("'%s' is not an administrator.", $USER_TEST))
EndIf
_SeLocalFree($pDacl)
_SeFreeSid($pAdminsSid)
_SeHeapFree($pSid) 谢谢P大的回复,明天到公司测试后回复。如各位有其它可检查指定的帐号是否管理员的方法也请告知. 功能可以实现并且测试不存在的帐号时提示"帐号名与安全标识符间无任何映射关系",谢谢P大的指导! 支持一下了,看看了 以前也提过同样的问题,是P版的成果帮助了我,奈何批量检测其他PC时不方便,于是自己搞了个,你试试:
MsgBox(0,"",_ISAdmin("itsadmin"))
Func _ISAdmin($username)
$strComputer="." ;要确定得计算机名或者IP
$colLocalComputer = ObjGet("WinNT://"& $strComputer)
Dim $group=["group"]
$colLocalComputer.Filter = $group
For $objGroup In $colLocalComputer
If $objGroup.Name = "Administrators" Then
For $objUser In $objGroup.Members
If $objUser.Name = $username Then Return 1;是管理员返回1,反之返回0
Next
EndIf
Next
EndFunc
谢谢502762378兄的代码,两种方案各有优劣,P大的方法可检测域帐号但原始代码相对复杂并且只能检查本机的帐号.如只需判断指定用户是否本机管理员编译后的文件比较大,想找一个比较简单且可判断域帐号是否管理员的方法.
而502762378兄的代码不支持域帐号,对于本机帐号非常高效,另外,在检查远程计算机时有些检查时间会很长 后台授予本机管理员权限不就是把user的域账号加入Administrators的组里吗?怎么会检查不出呢
话说P版的码太高深 回复 8# 502762378
正确点说应该是脚本不能直接判断指定帐号所在组是否本机的管理员,而判断判断指定的组是否在本机Administrators组是OK的,P大的UDF则可直接查询 回复 9# fuinei
一个域账号在本机可以加不止一个组。。 效率如何,这个要看时间复杂度的,2#的代码可以在常数时间内完成,时间复杂度为o(1),即:系统中存在1个账户和1000个账户,效率是没有区别的,效率不取决于账户数量。6#502762378兄是采用循环判断的方式,效率取决于账户数量,复杂度是o(n),n越大,效率越低。 回复 10# 502762378
域帐号可能在本机不止只属于一个组,但只要在administrators组就具有管理员权限了。 回复 11# pusofalse
P大说到点子上了,6#502762378兄的代码如判断指定的组是否在本机管理员中效率还是挺高的 回复 11# pusofalse
只知解决问题,我会努力学习,达到优化 做个记号,这个很有用
页:
[1]
2