针对 Active Directory 进行查询

针对 Active Directory 进行查询

我的工作就是“剧本编写员”,这既是好事也是坏事……我的任务是编写以下剧本:

您能否创建一个脚本将所有具有不是 xyz.org 电子邮件地址的代理地址的用户从 Active Directory 中拉出来。

最好的方法是什么?我不确定在哪里可以找到这个。我现在正在研究它,但由于我不知道在搜索中使用什么术语最好……我花了比我希望的更长的时间才找到有用的东西。

利用这一点:

%SystemRoot%\SYSTEM32\rundll32.exe dsquery,OpenQueryWindow  

为我提供了一个轻量级的搜索工具,可以显示我想要的基本内容...唯一的问题是它没有“喜欢”或“包含”搜索功能。 在此处输入图片描述

我需要相同类型的搜索...但能够过滤掉不包含“xyz.org”的代理地址。

答案1

您的问题听起来像是 PowerShell 的工作。

如果你没有安装 PowerShell,请获取它这里。Windows 7 和 Server 2008 R2 已安装 PowerShell。

获取适用于 Active Directory 的 Quest PowerShell 命令。此扩展提供了用于编写各种 AD 操作脚本的便捷命令。

现在回答您的问题:

注意:您可以使这个查询变得更简单,但是为了更好地理解,我会稍微延伸一下。

# Get all Users and save it to a variable. 
#-SizeLimit 0 returns ALL users, otherwise only 1000 are returned.
# -IncludedProperties proxyaddresses makes sure the proxyaddresses are included

$allusers = Get-QADUser -SizeLimit 0 -IncludedProperties proxyaddresses

# Filter Users without a xyz.org email address and save them to a variable

$filteredusers = $allusers | where {!($_.proxyaddresses -like "*@xyz.org") -and $_.proxyaddresses}

# Sort and output the list

$filteredusers | sort Displayname | format-table Displayname, proxyaddresses -auto


# Other interesting fieldnames you could use with format-table
# GivenName, sn, mail, SamAccountName and many more
# 
# To get a list of all possible field names use: 
# $filteredusers[0] | format-list *
# This will return all fields of the first user saved in $filteredusers

答案2

这个免费的 AD 报告工具可能会有所帮助,因为您可以生成一个列表导入电子表格应用程序进行进一步细化 - 我在工作中使用它来管理我们的系统:

AD 信息 - Active Directory 报告工具

灵活的 Active Directory 报告工具,内置 140 多种报告,并可自行创建报告。AD Info 比其他 Active Directory 报告工具更灵活,界面现代且用户友好,可让您轻松查询 Active Directory 域以获取所需信息。使用应用程序附带的 140 多个查询之一,或使用自定义查询设计器根据您选择的任何属性创建自己的查询。

http://www.cjwdev.co.uk/Software/ADReportingTool/Info.html

答案3

使用vbscript:

    Set objRoot = GetObject("LDAP://RootDSE") 
    strDNC = objRoot.Get("DefaultNamingContext") 

    Const ADS_SCOPE_SUBTREE = 2

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection

    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

    objCommand.CommandText = "SELECT givenNames,sn,telephoneNunmber FROM '" & strDNC & "' WHERE objectCategory='user'" & § " And mail != '*@xyz.org'"
    Set objRecordSet = objCommand.Execute
    strResults = ""
    While Not objRecordSet.EOF
        If strResults = "" Then
            strResults = objRecordSet("givenNames") & "," & objRecordSet("sn") & "," & objRecordSet("telephoneNumber")
        Else
            strResults = strResults & VbCrLf & objRecordSet("givenNames") & "," & objRecordSet("sn") & "," & objRecordSet("telephoneNumber")
        End If
    Wend
    objRecordSet.Close

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile("Results.csv", True)
    objFile.Write strResults
    objFile.Close

    MsgBox "Finished. See Results.csv"

答案4

我使用的效果很好“AdFind”工具。至少在我所在组织的 AD 设置中,“proxyAddresses”作为标准属性之一返回,然后可以轻松地填充到 CSV 文件中以供以后处理,或者只是通过 grep 查找与 xyz.org 不匹配的任何内容……

adfind -nodn -default -f "(&(name=ljwobker))" name proxyaddresses

返回所有包含我的名字的记录(您可以使用通配符或将其删除为“每个人”,然后输出该用户的“name”和“proxyaddresses”属性。此查询返回:

[ljwobker:/home/ljwobker]$ adfind -nodn -default -f "(&(name=ljwobker))" name proxyaddresses

AdFind V01.49.00.00cpp Joe Richards ([email protected]) February 2015

Using server: server.xyz.org:389
Directory: Windows Server 2008 R2
Base DN: DC=xyz,DC=org

>name: ljwobker
>name: ljwobker
>proxyAddresses: x400:C=us;A= ;P=XYZ Org;O=Exchange;S=Wobker;G=Lawrence;
>proxyAddresses: X400:C=us;A= ;P=XYZ Org;O=Exchange;S=Wobker;G=LJ;
>proxyAddresses: SIP:[email protected]
>proxyAddresses: smtp:[email protected]
>proxyAddresses: SMTP:[email protected]

因此,如果我grep -v删除 xyz.org 地址,就只剩下 X400 的内容……严格来说,这符合您对“非 xyz.org”代理地址的标准,但您很可能还想过滤掉这些内容,只留下来自其他组织的代理地址。(我假设这是您的实际目标,但过滤部分应该足够简单……)

相关内容