fuinei 发表于 2012-3-27 18:11:29

[已解决]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报错截图:

pusofalse 发表于 2012-3-27 18:53:55

感谢测试,我现在才知道这个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)

fuinei 发表于 2012-3-27 21:34:21

谢谢P大的回复,明天到公司测试后回复。如各位有其它可检查指定的帐号是否管理员的方法也请告知.

fuinei 发表于 2012-3-28 08:55:57

功能可以实现并且测试不存在的帐号时提示"帐号名与安全标识符间无任何映射关系",谢谢P大的指导!

redapple2008 发表于 2012-3-28 08:59:54

支持一下了,看看了

502762378 发表于 2012-3-28 11:22:53

以前也提过同样的问题,是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

fuinei 发表于 2012-3-28 13:31:24

谢谢502762378兄的代码,两种方案各有优劣,P大的方法可检测域帐号但原始代码相对复杂并且只能检查本机的帐号.如只需判断指定用户是否本机管理员编译后的文件比较大,想找一个比较简单且可判断域帐号是否管理员的方法.
而502762378兄的代码不支持域帐号,对于本机帐号非常高效,另外,在检查远程计算机时有些检查时间会很长

502762378 发表于 2012-3-28 15:09:43

后台授予本机管理员权限不就是把user的域账号加入Administrators的组里吗?怎么会检查不出呢
话说P版的码太高深

fuinei 发表于 2012-3-28 17:28:38

回复 8# 502762378
正确点说应该是脚本不能直接判断指定帐号所在组是否本机的管理员,而判断判断指定的组是否在本机Administrators组是OK的,P大的UDF则可直接查询

502762378 发表于 2012-3-28 17:48:11

回复 9# fuinei

一个域账号在本机可以加不止一个组。。

pusofalse 发表于 2012-3-28 19:31:33

效率如何,这个要看时间复杂度的,2#的代码可以在常数时间内完成,时间复杂度为o(1),即:系统中存在1个账户和1000个账户,效率是没有区别的,效率不取决于账户数量。6#502762378兄是采用循环判断的方式,效率取决于账户数量,复杂度是o(n),n越大,效率越低。

fuinei 发表于 2012-3-28 20:41:09

回复 10# 502762378
域帐号可能在本机不止只属于一个组,但只要在administrators组就具有管理员权限了。

fuinei 发表于 2012-3-28 20:44:27

回复 11# pusofalse
P大说到点子上了,6#502762378兄的代码如判断指定的组是否在本机管理员中效率还是挺高的

502762378 发表于 2012-3-29 16:27:35

回复 11# pusofalse


只知解决问题,我会努力学习,达到优化

szp123 发表于 2012-5-30 09:45:08

做个记号,这个很有用
页: [1] 2
查看完整版本: [已解决]AU3判断指定的用户是否具有本机管理员权限的问题