我在加入域的 Windows 10 计算机上,想查询我自己的用户帐户的属性。 有没有内置工具可以做到这一点?
它不是管理员计算机,而且我没有安装 RSAT。我的计算机似乎没有:
dsget
dsquery
ldapsearch
ldp
- PowerShell
ActiveDirectory
模块
还有其他内置工具吗?我的意思是,肯定有某物,因为至少我的电脑能够查询 AD,但是有没有我作为用户也可以使用的工具?
答案1
Windows 具有分布式系统集成可供程序使用的接口,支持通用 LDAP 访问。
PowerShell 可以通过以下类型访问 ADSI System.DirectoryServices
:
这
[System.DirectoryServices.DirectoryEntry]
类型(别名为[ADSI]
)代表特定条目 - 当给定一个 LDAP 对象时,其属性直接对应于 LDAP 条目的属性:$obj = [adsi] "LDAP://CN=foo,OU=bar,DC=example,DC=com" echo $obj.displayName $obj | fl *
您无需指定服务器 – Windows 默认使用 AD 目录。(该
LDAP://
部分区分大小写;这是一个ADSI 绑定字符串(不是 URL。)这
[System.DirectoryServices.DirectorySearcher]
类型(别名为[ADSISearcher]
)代表 LDAP搜索查询如果您还不知道用户 DN,可以使用它来查找您的用户 DN:$qry = [adsisearcher] "(sAMAccountName=stackprotector)" $qry.FindAll().Path
从某个 MSDN 文档页面复制的更详细的示例(在 AD 中,搜索
anr
伪属性是 GUI 工具解析名称的方式):$qry = New-Object DirectoryServices.DirectorySearcher $qry.Filter = '(&(objectCategory=person)(anr=Stack))' $qry.SearchRoot = 'LDAP://OU=Laptops,OU=Computers,DC=contoso,DC=com' $qry.FindAll()
但 ADSI 最初是一个 COM+ API,早于 PowerShell 甚至 .NET,因此微软当然有使用它的示例来自 VBScript和来自 ADODB(乃至来自 ASP,但这在这里没有帮助)。
您还应该能够安装和使用一些 RSAT 工具,而无需任何特殊权限(除了本地 Windows 管理员进行安装)。默认情况下,该目录对任何经过身份验证的客户端都是开放的。
您可以将第三方 LDAP 客户端与 AD 结合使用 - 域控制器将使用您的用户凭据,这是大多数 Windows GUI 工具首先在 AD 中查找数据的方式(只有某些任务才需要机器加入帐户)。但是,最好使用支持通过 GSSAPI 或 GSS-SPNEGO 进行 Kerberos 身份验证的客户端,因为这可以保证适用于任何 AD 设置。使用 NTLM 或“简单绑定”(密码身份验证)的工具可能会或可能不会起作用,具体取决于域配置。
例如,SysInternals ADExplorer来自 Microsoft,无需安装即可使用。(当系统提示输入服务器详细信息时,请保留所有字段为空白,然后单击“连接”。)
(RSAT 工具“ADSIEdit”和“dsa.msc”在技术上无需完整安装即可使用,事实上,甚至微软官方的说明也曾说过“从 .cab 中提取这些文件并对其进行 regsvr32 操作”,但你做该部分需要 Windows 本地管理员访问权限regsvr32
。
答案2
来自 user1686 的精彩回答,我导出了下面这行来显示当前登录用户账户的属性:
[adsi] ([adsisearcher] "(sAMAccountName=$env:USERNAME)").FindAll().Path | Format-List *
更多有用的查询
获取某个组的所有成员(由 sAMAccountName 提供):
([adsisearcher] "(&(objectClass=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=$(([adsisearcher] "(sAMAccountName=REPLACE_ME)").FindOne().GetDirectoryEntry().distinguishedName)))").FindAll().GetDirectoryEntry() | Select-Object -ExpandProperty sAMAccountName | Sort-Object
获取用户的所有组(由 sAMAccountName 给出):
([adsisearcher] "(sAMAccountName=REPLACE_ME)").FindOne().GetDirectoryEntry().memberOf
检查用户(由 sAMAccountName 给出)是否是组(由 sAMAccountName 给出)的成员:
([adsisearcher] "(&(sAMAccountName=REPLACE_ME_WITH_USERNAME)(memberOf:1.2.840.113556.1.4.1941:=$(([adsisearcher] "(sAMAccountName=REPLACE_ME_WITH_GROUPNAME)").FindOne().GetDirectoryEntry().distinguishedName)))").FindAll().Count -gt 0
获取由 sAMAccountName 给出的账户状态:
([adsisearcher] "(sAMAccountName=REPLACE_ME)").FindOne().GetDirectoryEntry().userAccountControl | %{[PSCustomObject]@{AccountDisabled = [bool] ($_ -band 2); AccountLockedOut = [bool] ($_ -band 16); PasswordDoesNotExpire = [bool] ($_ -band 65536); PasswordExpired = [bool] ($_ -band 8388608);}}
示例输出:
AccountDisabled AccountLockedOut PasswordDoesNotExpire PasswordExpired --------------- ---------------- --------------------- --------------- False False False False
通过 sAMAccountName 模式获取所有对象:
([adsisearcher] "(sAMAccountName=REPLACE_ME*)").FindAll().GetDirectoryEntry() | Select-Object -Property distinguishedName, sAMAccountName
答案3
net.exe
使用/domain
交换机查询AD:
REM Show account details, like password metadata and group memberships
net user %USERNAME% /domain
REM Show members of a group
net group "domain users" /domain
REM Show password policy
net accounts /domain
REM List all usernames
net user /domain
REM List all groups
net group /domain
net config workstation
net stats workstation
有关参数的更多信息,请访问ss64.com,输出示例雷内·尼芬格的网站以及历史背景维基百科。 这微软官方文档是不完整的,在版本之间切换可能会有所帮助。