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

如何实现show出本地admins群组所有账号或者清空本地admins群组所有账号

[复制链接]
发表于 2009-6-3 09:51:12 | 显示全部楼层 |阅读模式
本帖最后由 qqgghh1 于 2009-6-3 13:16 编辑

您好:
我想实现如下目的:
用命令SHOW出本地所有属于administrators群组的账号或群组。
或者删除所有本地属于administrators群组的账号或群组(添加特定账号至admins群组容易实现,删除指定属于admins群组的也可以实现,但是删除所有账号(有些是无法预知的)不知道怎么实现)
还请各位老大提供帮助,感谢!能用AU3实现的最好不过了!

下面是我从网上找的一些资料.
问:
您好,脚本专家!如何从本地 Administrators 组中删除组?
-- XX
答:
您好,XX。有一位脚本专家还隐约记得早年一部名为 Branded 的电视节目,节目中的主人公(由查克·康纳斯扮演)被指控为懦夫并被不光彩地从美国骑兵队开除。差不多所有脚本专家都记得它的开头部分:骑兵队扯掉该士兵制服上的肩章并将它的剑一折两断,然后令其耻辱地快步走出要塞。
为何要忆起这一幕?没有什么真正的原因,我们只是认为如果每当将用户或组从本地 Administrators 组中删除时都举行类似的仪式会很酷。不过,在这种理想实现之前,可以使用与以下类似的脚本将组(此例中为 Active Directory 组)从本地 Administrators 组中删除:
[复制此代码]CODE:
strComputer = "atl-fs-01"
Set objAdmins = GetObject("WinNT://" & strComputer & "/Administrators")
Set objGroup = GetObject("WinNT://fabrikam/finance")
objAdmins.Remove(objGroup.ADsPath)

是的,这非常简单,不是吗?此脚本首先会将计算机的名称(在本例中为 atl-fs-01)赋值给名为 strComputer 的变量。然后,我们就可以使用下面这行代码绑定到该计算机上的本地 Administrators 组:
Set objAdmins = GetObject("WinNT://" & strComputer & "/Administrators")
获得对 Administrators 组的对象引用后,我们的下一个任务便是创建另一个对象引用,它是对将删除的组的引用。下面这行代码就用来完成该任务:
Set objGroup = GetObject("WinNT://fabrikam/finance")
请注意,引用组帐户时我们使用老式的 Windows NT 式命名约定:fabrikam/finance。为什么会是这样?很简单:为对本地用户和组进行操作,我们不得不使用 WinNT 提供程序。WinNT 提供程序不明白 Active Directory 术语,对于与以下类似的对象路径摸不着头脑:
cn=Finance Users, ou=Finance, dc=fabrikam, dc=com
因此,我们不得不退一步采用老式的帐户名:域名/登录名。但是没关系:所幸 Active Directory 也明白此命名约定。当我们请求帐户 fabrikam/finance 时,Active Directory 对我们的言语知道得一清二楚。
注意:此问题以前提出过,但值得再次提出:是的,您可以使用 WinNT 提供程序访问 Active Directory 中的对象。而且,对象路径要简单得多,这没错。但请不要冒险行事:请仅在绝对必要的情况下使用 WinNT 提供程序。为什么这么说呢?好吧,举一个例子,就用户帐户而言,通常在与 Active Directory 协作时使用的 LDAP 提供程序支持超过 200 个属性;而 WinNT 提供程序仅支持约 20 个属性。LDAP 提供程序要强大得多、有用得多。
获得对组的对象引用后,我们所要做的全部工作便是调用 Remove 方法,将该组从本地 Administrators 组中删除:
objAdmins.Remove(objGroup.ADsPath)
我们仍然认为撕掉该人衬衣上的口袋保护袋,然后用膝盖折断他的订书机会更酷,但这已经可以达到目的。
当然,您要删除的组可能不是 Active Directory 组,而可能是本地组。这会成为问题吗?不会;实际上还要简单一点儿。只需直接绑定到本地机上的组帐户,然后将它删除:
strComputer = "atl-fs-01"
Set objAdmins = GetObject("WinNT://" & strComputer & "/Administrators")
Set objGroup = GetObject("WinNT://finance")
objAdmins.Remove(objGroup.ADsPath)
顺便说一句,从一个组中删除另一个组的过程与从一个组中删除用户的过程完全相同:绑定到目标组(此例中为本地 Administrators 组),绑定到要删除的对象(无论是组还是用户,都没有关系),然后调用 Remove 方法,将要删除帐户的 ADsPath 作为唯一参数进行传递。
发表于 2009-6-3 09:56:20 | 显示全部楼层
不懂,纯支持,兄弟的钱真多
发表于 2009-6-3 10:34:47 | 显示全部楼层
#include <Array.au3>
#include <LocalSecurityAuthority.au3>

; 枚举本地用户组。
$aGroups = _LsaEnumerateLocalGroups()
_ArrayDisplay($aGroups)

; 枚举本地所有用户
; $aUsers = _LsaEnumerateLocalUsers()
_ArrayDisplay($aUsers)

; 列举administrators组中的用户
$aMember = _LsaLocalGroupGetMembers("Administrators")
_ArrayDisplay($aMember)

; 从管理员组中删除test用户(test依然存在)
$iResult = _LsaLocalGroupDelMembers("Administrators", "test")
If $iResult Then Msgbox(0, "Ok", "Done")

; 彻底删除test用户
$iResult = _LsaDelLocalUser("test")
If $iResult Then Msgbox(0, "Ok", "Done")

; 删除administrators用户组,慎用。
$iResult = _LsaDelLocalGroup("Administrators")
If $iResult Then Msgbox(0, "Ok", "Done")
LocalSecurityAuthority.au3 http://www.autoitx.com/forum.php ... page%3D1&page=1

评分

参与人数 1金钱 +5 收起 理由
qqgghh1 + 5

查看全部评分

 楼主| 发表于 2009-6-3 11:00:30 | 显示全部楼层
感谢,我带进去测试下。感谢。等会OK后我再结案,谢谢!
 楼主| 发表于 2009-6-3 13:45:53 | 显示全部楼层
把我的语句发上来,执行时有错误,按继续即可。
#include <Array.au3>
#include <LocalSecurityAuthority.au3>
$aMember = _LsaLocalGroupGetMembers("administrators")
_ArrayDisplay($aMember);在listview中显示它们.
; 从管理员群组中删除所有账号或群组,系统账号administrator删除不掉,这样也好,我的目的不是删除它
For $i = 1 To $aMember[0][0]
        $iResult = _LsaLocalGroupDelMembers("administrators",$aMember[$i][0] )
Next
If $iResult Then Msgbox(0, "Ok", "Done")
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-28 15:19 , Processed in 0.072039 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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