我熟悉在大多数情况下使用 NET 命令获取本地用户和组的信息。但是,我在使用它获取具有长名称的域组的信息时遇到了问题。NET USER 的输出似乎将组名限制在 20 个字符左右,而我还没有找到使用 NET GROUP 获取任何名称超过该长度的组的信息的方法。
当然,从我自己的工作站,我可以使用远程服务器管理工具实用程序(例如:“ds ...”命令或PowerShell中的Active Directory模块)来获取我需要的信息。但是,我还希望能够从可能没有 RSAT 且我可能无法/不允许安装其他工具的其他系统查找域组详细信息。
虽然使用 NET GROUP 命令解决问题会很有趣,但我并不一定局限于该工具。但是,我确实需要将自己限制在 Windows 7(或类似)操作系统的核心安装中可用的工具,以便我可以轻松地将解决方案移植到不同的计算机中,而添加其他工具可能不是一种选择。如果有办法使用 WMIC 或 PowerShell 之类的工具来实现这一点,而无需额外的 RSAT 模块,我绝对有兴趣了解一下。
例如:“MyReallyLongDomainGroupName”是本地管理员组的成员。那么,谁有系统的管理员访问权限?或者“AnotherVerboseDomainGroupName”在某些文件共享权限中 - 谁有权访问该共享?
答案1
旧NET
命令仍具有 Windows NT 时代的局限性。要处理较长的名称,最好使用各种ds...
命令dsquery
、dsmod
等,或第三方工具,如adfind
。这样就不会有名称长度限制。
编辑:
这些ds
工具是独立的 EXE,虽然存在于 RSAT 中,但可以自由复制。即便如此,因为我想尊重您请求的精神,这里有一个依赖于 ADSI 接口(存在于 Windows 中,无需安装 RSAT - 它是一个基本操作系统组件)的 Powershell 脚本,它将枚举组的成员身份。
# iADSNameTranslate constants
$ADS_NAME_INITTYPE_GC = 3
$DISTINGUISHEDNAME = 1
$DOMAINSIMPLE = 5
$UNKNOWN = 8
if ($args.count -ne 1) { "`nUsage: ./GroupEnum.ps1 <DOMAIN\groupName>`n"; Exit; }
$ns = New-Object -ComObject NameTranslate
[System.__ComObject].InvokeMember(“init”, ”InvokeMethod”, $null, $ns, ($ADS_NAME_INITTYPE_GC, $null))
[System.__ComObject].InvokeMember(“Set”, ”InvokeMethod”, $null, $ns, ($UNKNOWN, $args[0]))
$dn = [System.__ComObject].InvokeMember(“Get”, ”InvokeMethod”, $null, $ns, $DISTINGUISHEDNAME)
$Group = [ADSI]"LDAP://$dn"
if ($Group.SchemaClassName -eq "group") {
$Group.Member | ForEach-Object {
$x = [ADSI]"LDAP://$_"
if ($x.SchemaClassName -eq "user") { $x.sAMAccountName }
}
}
我在未安装 RSAT 的 Windows 7 x64 SP1 计算机上使用受限用户帐户对此进行了测试。我还使用名为“123456789012345678901234567890123456789012345678901234567890”的组进行了测试。
这个脚本中根本就没有错误检查。
答案2
添加另一个答案,因为我当前的答案是基于当前登录的用户组...并且 OP 在评论中指出:
例如:“MyReallyLongDomainGroupName”是本地管理员组的成员。那么,谁有系统的管理员访问权限?或者“AnotherVerboseDomainGroupName”在某些文件共享权限中 - 谁有权访问该共享?
所以你看...我从 Win7 工作站上的普通用户帐户对此进行了测试:
从 RUN 行 (win+R)
Rundll32 dsquery.dll OpenQueryWindow
这将弹出一个 AD 查询窗口,您可以在其中找到相关的组...双击该组...并查看该组中的用户。
答案3
好的,所以知道您想要从不是您的工作站的域计算机获取非 RSAT 工具,然后我假设您想要找出该工作站上的用户所属的组。
如果是这样的话,我能想到几个选择:
- 你可以跑
WHOAMI /GROUPS
- 您可以运行
mstsc
并远程桌面连接到您的工作站或 DC,然后使用常规工具 - 你可以跑
gpresult /R /SCOPE USER
当然,所有这些都要求您在域中并且计算机能够查询 DC。
希望这会有所帮助...这是我目前能想到的最好的办法。
答案4
您可以使用 Powershell。
Get-ADGroup -Filter '*'
Get-ADGroup -Filter '*' | Select-Object Name
第一个命令只打印群组的一系列详细信息。第二个命令只打印群组名称。
编辑:如果 ActiveDirectory 模块仅通过 RSAT 可用,则这是一个.net 解决方案。
$dn = New-Object System.DirectoryServices.DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr","Username","PWD")
$dsLookFor = new-object System.DirectoryServices.DirectorySearcher($dn)
$dsLookFor.Filter = "(&(objectCategory=group))";
$dsLookFor.SearchScope = "subtree";
$n = $dsLookFor.PropertiesToLoad.Add("cn");
$n = $dsLookFor.PropertiesToLoad.Add("distinguishedName");
$n = $dsLookFor.PropertiesToLoad.Add("sAMAccountName");
$lstUsr = $dsLookFor.findall()
foreach ($usrTmp in $lstUsr)
{
Write-Host $usrTmp.Properties["samaccountname"]
}