一般来说,没有官方记录的 PowerShell 最佳实践(混合变量太多,但有些人已经将他们的想法放在了这个主题中,例如,这个 - https://github.com/PoshCode/PowerShellPracticeAndStyle)或者你问什么来自微软。
至于你指向这里:
我想我可以拉 cn=Exchange 的成员安装域服务器
并对它们进行一些依赖于网站的排名。
这不是什么新鲜事,也不是什么棘手的事情,所以你可以这样做。
我的个人库中有用于执行此操作的代码以及用于其他执行资源的代码,因此我不必为 Exchange、SQL、DC 等硬编码服务器名称。
有几个关于这个主题的博客(已经有一段时间了)提供了示例代码,可以按原样使用或根据需要进行调整,这就是为什么我问你搜索了什么。
这里有一个关于如何做到这一点的博客示例:
https://use-powershell.blogspot.com/2012/12/find-exchange-servers-in-domain.html
提供的例子:
- 具有邮箱的 Active Directory 用户将具有 2 个属性(msExchHomeServerName 和 homemdb),其中包含
有他的邮箱的邮箱服务器 - 一旦连接到您的一台服务器
可以使用交换控制台找到其余的;
Get-ADUser samaccountname -Properties msExchHomeServerName, homemdb |Select-Object msExchHomeServerName, homemdb |Format-List
- 活动目录计算机类型对象在 servicePrincipalName 属性中包含“exchange”字样;你只能使用你的
包含您的服务器的组织单位(如果有的话)
缩小搜索范围:
Get-ADComputer -Filter * -SearchBase 'OU= SERVERS, DC=domain_name,DC=net' -Properties * | Where-Object {$_.serviceprincipalname -like '*exchange*'} |select-object name
- 活动目录配置分区包含域中交换服务器的信息;你可以搜索类的对象
msExchExchangeServer:
Get-ADObject -LDAPFilter "(objectClass=msExchExchangeServer)" –SearchBase "CN=Configuration,DC=domainname,DC=net" | Select-Object name
或者您可以列出来自“CN=Servers,CN=First Administrative Group,CN=Administrative Groups,CN=INTERNAL,CN=Microsoft
Exchange,CN=Services,CN=Configuration,DC=domainname,DC=net" 使用
powershell 或 ADSI Edit 控制台;
Get-ADObject -Filter * -SearchBase "CN=Servers,CN=First Administrative Group,CN=Administrative Groups,CN=INTERNAL,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=domainname,DC=net" -SearchScope onelevel
或者这篇文章:
https://social.technet.microsoft.com/Forums/ie/en-US/94d89161-9dfb-48fc-b307-2f0e1320c9dc/how-to-find-file-servers-and-exchange-servers-in-ad-
例子:
dsquery * "cn=Configuration,dc=MyDomain,dc=com" -Filter "(objectCategory=msExchExchangeServer)"
或者,如果您真的想在给定站点中获取 Exchange 服务器,那么这已经存在。请参阅此 GitHub 源代码:
https://github.com/mikepfeiffer/PowerShell/blob/master/Get-ExchangeServerInSite.ps1
提供的样本是:
function Get-ExchangeServerInSite {
$ADSite = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]
$siteDN = $ADSite::GetComputerSite().GetDirectoryEntry().distinguishedName
$configNC=([ADSI]"LDAP://RootDse").configurationNamingContext
$search = new-object DirectoryServices.DirectorySearcher([ADSI]"LDAP://$configNC")
$objectClass = "objectClass=msExchExchangeServer"
$version = "versionNumber>=1937801568"
$site = "msExchServerSite=$siteDN"
$search.Filter = "(&($objectClass)($version)($site))"
$search.PageSize=1000
[void] $search.PropertiesToLoad.Add("name")
[void] $search.PropertiesToLoad.Add("msexchcurrentserverroles")
[void] $search.PropertiesToLoad.Add("networkaddress")
$search.FindAll() | %{
New-Object PSObject -Property @{
Name = $_.Properties.name[0]
FQDN = $_.Properties.networkaddress |
%{if ($_ -match "ncacn_ip_tcp") {$_.split(":")[1]}}
Roles = $_.Properties.msexchcurrentserverroles[0]
}
}
}