更多有用的查询

更多有用的查询

我在加入域的 Windows 10 计算机上,想查询我自己的用户帐户的属性。 有没有内置工具可以做到这一点?

它不是管理员计算机,而且我没有安装 RSAT。我的计算机似乎没有:

  • dsget
  • dsquery
  • ldapsearch
  • ldp
  • PowerShellActiveDirectory模块

还有其他内置工具吗?我的意思是,肯定有某物,因为至少我的电脑能够查询 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 或 GS​​S-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 *

更多有用的查询

  1. 获取某个组的所有成员(由 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
    
  2. 获取用户的所有组(由 sAMAccountName 给出):

    ([adsisearcher] "(sAMAccountName=REPLACE_ME)").FindOne().GetDirectoryEntry().memberOf
    
  3. 检查用户(由 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
    
  4. 获取由 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
    
  5. 通过 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,输出示例雷内·尼芬格的网站以及历史背景维基百科。 这微软官方文档是不完整的,在版本之间切换可能会有所帮助。

相关内容