【问题标题】:Trying to dynamically connect in Powershell to nearest Exchange Server尝试在 Powershell 中动态连接到最近的 Exchange Server
【发布时间】:2019-12-02 21:14:50
【问题描述】:

New-PSSession 需要一个显式 Exchange 服务器的 -ConnectionURI。我不想在脚本中硬编码名称(我们有 32 台服务器),而且我希望它选择位于同一数据中心的交换。

我想要一个类似于 Get-ADDomainController -Discover -GetClosestSite 的解决方案,但似乎我希望太多了。

我想我可以拉出 cn=Exchange Install Domain Servers 的成员并对它们进行一些与站点相关的排名。

寻找最佳实践。

更新编辑:9/26 我已经实现了解决方案。它可能是特定于站点的,但我将在下面分享一个答案以显示最终代码。 postanote 提供的答案提供了帮助我前进的指针。

【问题讨论】:

    标签: powershell exchange-server


    【解决方案1】:

    一般来说,没有官方记录的 PowerShell 最佳实践(混合变量太多,但有些人已经将他们的想法放在了这个主题中,例如,这个 - https://github.com/PoshCode/PowerShellPracticeAndStyle)或者你问什么来自微软。

    至于你指向这里:

    我想我可以拉 cn=Exchange 的成员安装域服务器 并对它们进行一些依赖于网站的排名。

    这不是什么新鲜事,也不是什么棘手的事情,所以你可以这样做。

    我的个人库中有用于执行此操作的代码以及用于其他执行资源的代码,因此我不必为 Exchange、SQL、DC 等硬编码服务器名称。

    有几个关于这个主题的博客(已经有一段时间了)提供了示例代码,可以按原样使用或根据需要进行调整,这就是为什么我问你搜索了什么。

    这里有一个关于如何做到这一点的博客示例:

    https://use-powershell.blogspot.com/2012/12/find-exchange-servers-in-domain.html

    提供的例子:

    1. 具有邮箱的 Active Directory 用户将具有 2 个属性(msExchHomeServerName 和 homemdb),其中包含 有他的邮箱的邮箱服务器 - 一旦连接到您的一台服务器 可以使用交换控制台找到其余的;
    Get-ADUser samaccountname -Properties msExchHomeServerName, homemdb |Select-Object msExchHomeServerName, homemdb |Format-List
    
    1. 活动目录计算机类型对象在 servicePrincipalName 属性中包含“exchange”字样;你只能使用你的 包含您的服务器的组织单位(如果有的话) 缩小搜索范围:
    Get-ADComputer -Filter * -SearchBase 'OU= SERVERS, DC=domain_name,DC=net' -Properties * | Where-Object {$_.serviceprincipalname -like '*exchange*'} |select-object  name
    
    1. 活动目录配置分区包含域中交换服务器的信息;你可以搜索类的对象 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]
            }
        }
    }
    

    【讨论】:

    • 感谢您的 cmets...您说问题不是新问题,但我没有通过无数的 Google 和 StackExchange 搜索成功找到任何相关内容。我会看看你的链接。我的另一个问题是,这是入职前的情况。我们还没有为用户创建邮箱。因此,任何基于查找现有用户的方法也没有用。我们正在尝试运行一些规模指标来尝试平衡我们将在哪个邮箱中创建用户。
    • 不用担心它会发生。大多数时候,它只是通过部分琴弦循环来获得你想要的命中。大多数情况下,你击中了部分,然后你必须扩展它。几年前,当我第一次开始尝试做这种用例时,我必须这样做才能了解其他人已经尝试过、失败过和成功过的想法。当然,我最初从来没有得到完整的答案,但是改变问题,得到了我需要的东西,来解决我的需求。我的回复中提供的是我传递给我的队友和尝试做这件事的客户的正常样本。
    • 至于你这里的项目:“我们还没有为用户创建邮箱。所以任何基于查找现有用户的方法也没有用。我们正在尝试运行一些规模指标尝试平衡我们将在哪个邮箱中创建用户。”,那么最后一段代码应该可以让您到达您想要的位置。
    【解决方案2】:

    我接受 postanote 的回答是最有帮助的。

    最后,我创建了一个可能特定于站点和 Exchange 安装的解决方案,但它确实说明了另一种技术。

    我的限制与我发现并包含的大多数其他解决方案不同;给定用户当前在系统上没有邮箱。因此,这个 sn-p 之外的代码将收集一些数据,然后选择一个特定的数据库。

    我发现我们安装的Exchange服务器版本,在“CN=Exchange Install Domain Servers,CN=Microsoft Exchange System Objects”中创建了一些记录,特别是Members属性有一个服务器列表。 我提取了该列表,按站点(从本地到前面)对其进行排序,然后解析 FQDN 以形成要连接的 URI。

    Function Connect-Exchange {
         #  Find servers list, then sort by name given what site we are running in:  SITE1 = Ascending , SITE2 = Descending
         $ADSite = (Get-ADDomainController).Site
         if ($ADSite -like "SITE1*") { $descOrder =  $true } else { $descOrder = $false }
         $exchSession = $null                                     
         $ExchServersDN = "CN=Exchange Install Domain Servers,CN=Microsoft Exchange System Objects,DC=example,DC=com”
         $ExchServers = (Get-ADObject -Identity $($ExchServersDN) -Properties Member).Member | Sort-Object -Descending:$descOrder 
    
         # Iterate through Exchange server list until connection succeeds
         $i = 0;
         while ((-Not $exchSession) -and ($i -lt $ExchServers.Count)) { 
            $ExchServerURI = "http://" + (Get-ADObject -Identity $ExchServers[$i] -Properties dNSHostName).dnsHostName + "/Powershell"
            $exchSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionURI $ExchServerURI  -ErrorAction SilentlyContinue
            If (-Not $exchSession)  { $i++ }
            else {                                                                 
                Import-PSSession $exchSession -DisableNameChecking | Out-Null
            }
         }
         return $exchSession
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 2021-07-14
      • 2016-07-14
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      相关资源
      最近更新 更多