找回密码
 加入
搜索
查看: 9740|回复: 16

[系统综合] [已解决]AU3判断指定的用户是否具有本机管理员权限的问题

 火.. [复制链接]
发表于 2012-3-27 18:11:29 | 显示全部楼层 |阅读模式
本帖最后由 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
报错截图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 贡献 +5 收起 理由
pusofalse + 10 + 5

查看全部评分

发表于 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)

评分

参与人数 2金钱 +50 收起 理由
afan + 30
user3000 + 20 Cool

查看全部评分

 楼主| 发表于 2012-3-27 21:34:21 | 显示全部楼层
谢谢P大的回复,明天到公司测试后回复。如各位有其它可检查指定的帐号是否管理员的方法也请告知.
 楼主| 发表于 2012-3-28 08:55:57 | 显示全部楼层
功能可以实现并且测试不存在的帐号时提示"帐号名与安全标识符间无任何映射关系",谢谢P大的指导!
发表于 2012-3-28 08:59:54 | 显示全部楼层
支持一下了,看看了
发表于 2012-3-28 11:22:53 | 显示全部楼层
以前也提过同样的问题,是P版的成果帮助了我,奈何批量检测其他PC时不方便,于是自己搞了个,你试试:
MsgBox(0,"",_ISAdmin("itsadmin"))

Func _ISAdmin($username)
$strComputer="." ;要确定得计算机名或者IP
$colLocalComputer = ObjGet("WinNT://"& $strComputer)
Dim $group[1]=["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

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2012-3-28 13:31:24 | 显示全部楼层
谢谢502762378兄的代码,两种方案各有优劣,P大的方法可检测域帐号但原始代码相对复杂并且只能检查本机的帐号.如只需判断指定用户是否本机管理员编译后的文件比较大,想找一个比较简单且可判断域帐号是否管理员的方法.
而502762378兄的代码不支持域帐号,对于本机帐号非常高效,另外,在检查远程计算机时有些检查时间会很长
发表于 2012-3-28 15:09:43 | 显示全部楼层
后台授予本机管理员权限不就是把user的域账号加入Administrators的组里吗?怎么会检查不出呢
话说P版的码太高深
 楼主| 发表于 2012-3-28 17:28:38 | 显示全部楼层
回复 8# 502762378
正确点说应该是脚本不能直接判断指定帐号所在组是否本机的管理员,而判断判断指定的组是否在本机Administrators组是OK的,P大的UDF则可直接查询
发表于 2012-3-28 17:48:11 | 显示全部楼层
回复 9# fuinei

一个域账号在本机可以加不止一个组。。
发表于 2012-3-28 19:31:33 | 显示全部楼层
效率如何,这个要看时间复杂度的,2#的代码可以在常数时间内完成,时间复杂度为o(1),即:系统中存在1个账户和1000个账户,效率是没有区别的,效率不取决于账户数量。6#502762378兄是采用循环判断的方式,效率取决于账户数量,复杂度是o(n),n越大,效率越低。
 楼主| 发表于 2012-3-28 20:41:09 | 显示全部楼层
回复 10# 502762378
域帐号可能在本机不止只属于一个组,但只要在administrators组就具有管理员权限了。
 楼主| 发表于 2012-3-28 20:44:27 | 显示全部楼层
回复 11# pusofalse
P大说到点子上了,6#502762378兄的代码如判断指定的组是否在本机管理员中效率还是挺高的
发表于 2012-3-29 16:27:35 | 显示全部楼层
回复 11# pusofalse


只知解决问题,我会努力学习,达到优化
发表于 2012-5-30 09:45:08 | 显示全部楼层
做个记号,这个很有用
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-11 17:54 , Processed in 0.088615 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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