如何仅使用核心 Windows 实用程序从命令行查看域组的信息?

如何仅使用核心 Windows 实用程序从命令行查看域组的信息?

我熟悉在大多数情况下使用 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...命令dsquerydsmod等,或第三方工具,如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 工具,然后我假设您想要找出该工作站上的用户所属的组。

如果是这样的话,我能想到几个选择:

  1. 你可以跑WHOAMI /GROUPS
  2. 您可以运行mstsc并远程桌面连接到您的工作站或 DC,然后使用常规工具
  3. 你可以跑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"]
}

相关内容