我的工作就是“剧本编写员”,这既是好事也是坏事……我的任务是编写以下剧本:
您能否创建一个脚本将所有具有不是 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 多个查询之一,或使用自定义查询设计器根据您选择的任何属性创建自己的查询。
答案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”代理地址的标准,但您很可能还想过滤掉这些内容,只留下来自其他组织的代理地址。(我假设这是您的实际目标,但过滤部分应该足够简单……)