Exchange Server'ı PowerShell ile Belgelemek
Çalışan (ya da çalışmayan) bir ortamı belgelemek, o ortam için neyin yapılandırıldığına dair daha iyi bir fikir edinmek amacıyla genellikle yöneticiler ve danışmanlar tarafından üstlenilen önemli bir görevdir ve Exchange Server 201x de bundan farklı değildir. Uygun bakım, geçiş ve iş sürekliliği faaliyetleri büyük ölçüde bu belgelere bağlı olabilir ve neyin yapılandırıldığına dair yeterli ve doğru bir anlayışa sahip olmak, bu faaliyetlere/görevlere yardımcı olacaktır. Peki bir Exchange Server ortamını nasıl belgeleyebiliriz? Get cmdlet'ler ve dışa aktarma dosyalarının (txt, csv ve HTML) birleşimi, bir ortamın doğru belgelerini oluşturmamıza olanak tanıyacak.
Uyarı: Çok fazla hareketli parça olduğundan bu makale, Exchange'deki her bir öğenin nasıl belgeleneceği konusunda ayrıntılı bilgi vermeyecektir. Ancak makalede belgelenmesi gereken en önemli hususlardan bazılarına odaklanılacaktır.
Çerçeveyi Oluşturma
Belge cmdlet'lerine dalmadan önce, bu verileri yakalamak için çerçevemizi oluşturmamız gerekiyor ve bu, ihtiyaç duyacağımız diğer değişkenlerin yanı sıra çıktı dosyalarının oluşturulmasını veya tanımlanmasını içerecektir. İlk olarak, cmdlet'lerimizin bazı çıktıları geniş, çok geniş olabilir. Bu nedenle, hiçbir ayrıntıyı kaçırmamak için pencerenin arabellek boyutunu ayarlamamız gerekebilir.
PowerShell penceresi Arabellek Boyutunu geniş çıktıya izin verecek şekilde ayarlamak için bu tek satırı kullanın:
$Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size (500, 9999)
Daha sonra, bir ana çıktı hedef dosyası ve dosya yolu tanımlamamız gerekiyor:
$Path = (Get-Item -Path ".\" -Verbose).FullName$File = "ExchangeServerInformation.Txt"$Destination = $Path+"\"+$FileExchange Sunucuları, PowerShell ile sorgulanabilecek çok çeşitli veri ve yapılandırma bilgilerini içerir ve ortamın boyutuna bağlı olarak bu verilerin ayrı tutulmasına yardımcı olacak ek dosyalar oluşturmak isteyebilirsiniz. Örneğin, 100 posta kutusu içeren bir ortam, çalışması kolay olacağından tüm ayarları ve verileri tek bir dosyaya aktarabilir, ancak 10.000'den fazla posta kutusu bulunan bir ortam bunu oldukça kısıtlayıcı bulacak ve dosyaları tanımlamak isteyebilir. her biri ayrı bileşen. Bazı örnek günlük dosyaları aşağıda gösterilmektedir (Get cmdlet'leri çalıştırmadan önce önceden tanımlanmıştır):
Kullanıcının posta kutuları hakkında örnek veri toplama:
$ArchiveMailboxDestination = $Path+"\ArchiveMailboxStatistics.txt"$CASMailboxDestination = $Path+"\CASMailboxProperties.csv"$MailboxStatDestination = $Path+"\MailboxStatistics.txt"Örnek sunucu yapılandırma dosyaları:
$ExchangeDatabaseDestination = $Path+"\ExchangeDatabaseInformation-Detailed.txt"$NICInfoCSVDestination = $Path+"\ExchangeServerNICConfiguration.csv"Yukarıdaki liste tam kapsamlı olmasa da kendi senaryolarınızı oluşturmaya başlamanız için iyi bir başlangıç noktasıdır.
Yapılandırma Verilerini Keşfetme ve Dışa Aktarma
Exchange karmaşık bir sistemdir ancak veri toplama konusunda daha organize bir yaklaşıma olanak sağlayacak bileşenlere ayrılabilir. Bunu parçalara ayırmak, Exchange hakkında kapsamlı bilgi sahibi olmayı ve ardından verileri ortaya çıkarmaya ve raporlama amacıyla raporlar sağlamaya yardımcı olacak arka uç PowerShell cmdlet'leri hakkında bilgi sahibi olmayı gerektirir. Exchange ortamını çalışan parçalara ayıralım ve bazı örnek belgeler oluşturalım.
Örnek Dağılımı
Exchange Sunucusu Kurulumu: Sunucu Sayısı, Sürüm, Yama Düzeyi, Veritabanları, URL'ler
Windows Sunucu Yapılandırması: Donanım veya Kaynaklar (VM), Sayfa Dosyası, Olay Günlükleri, Sürüm, Disk Boyutu
Kullanıcı Posta Kutuları: Posta Kutusu İstatistikleri, Arşiv Posta Kutusu İstatistikleri, İzin Verilen Protokoller ve Posta Kişileri
Değişim Yazılımı ayarları: E-posta Adresi Politikaları, Adres Defteri Politikaları, Kimlik Doğrulama Politikaları, Alma Bağlayıcıları, Gönderme Bağlayıcıları, DLP Politikaları vb.
Not: Ortamınızı tanıyın. Binden fazla varsa sanki modası geçmiş gibi '-ResultSize Unlimited'ı kullandığınızdan emin olun.
Exchange Sunucusu Kurulumu
Öncelikle Exchange Server'ın kendi yapılandırmasını inceleyelim.
Sürüm, Sürüm, Rol ve Site
$ExchangeServers = Get-ExchangeServer$LocalExchangeServer = $Env:ComputerName$ServerVersionCheck = $TrueForeach ($ExchangeServer in $ExchangeServers) {$Server = $ExchangeServer.Name$Site = $ExchangeServer.Site$ServerRole = $ExchangeServer.ServerRole$Edition = $ExchangeServer.EditionIf ($Server -ne $LocalExchangeServer) {$Version = Invoke-Command -ComputerName $Server -ScriptBlock {$Ver = Get-Command Exsetup.exe | ForEach-Object {$_.FileversionInfo};$Version = $Ver.FileVersion;$Version} -ErrorAction Stop} Else {$Ver = Get-Command Exsetup.exe | ForEach-Object {$_.FileversionInfo}$Version = $Ver.FileVersion}$Line = "$Server|"+"$Version|"+"$Edition|"+"$ServerRole|"+"$Site" | Out-file $Destination -Append}
Komut dosyasından elde edilen sonuçlar şuna benzer:
Sunucu sürümlerini ve sunucuda hangi rollerin yüklü olduğunu doğrulamak için kullanışlıdır.
Posta Kutusu Veritabanları
Daha sonra Exchange veritabanlarımızdan bazı temel bilgileri alacağız:
Get-MailboxDatabase | FT Name, Server, Recovery, ReplicationType, LogFolderPath, EdbFilePath, DeletedItemRetention, MailboxRetention -Auto | Out-file $Destination -Append
Örnek çıktı:
URL'ler
İstemci bağlantıları ve dış işlemler açısından önemli olan Exchange sunucularına yönelik doğru URL yapılandırmasına sahip olmak önemlidir ve son kullanıcı için daha iyi bir deneyim sağlayabilir. Aşağıdaki kod bloğu her URL türünü sorgular ve sonuçları bir dosyaya aktarır.
$Line = Get-OWAVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-WebServicesVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-ActiveSyncVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-AutoDiscoverVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-MAPIVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-OABVirtualDirectory -ADPropertiesOnly |ft Server,*lurl* -Auto | Out-file $Destination -Append$Line = Get-ClientAccessService | ft Name,*uri* -Auto | Out-file $Destination -AppendWindows Sunucu Yapılandırması
Donanım veya Kaynaklar (VM), Sayfa Dosyası, Olay Günlükleri, İşletim Sistemi Sürümü
Exchange sunucusunun bir diğer önemli kısmı, üzerinde çalıştığı temel Windows Server'ın yapılandırmasıdır.
İşlemci Çekirdekleri - Mantıksal ve Fiziksel
Daha sonra mantıksal ve fiziksel işlemcilerin sayısını kontrol edin. Bu, belgelemenin yanı sıra Hyperthreading'in kullanımda olmadığını doğrulamak için de kullanılabilir.
$Processors = Get-WMIObject Win32_Processor -ComputerName $Server$LogicalCPU = ($Processors | Measure-Object -Property NumberOfLogicalProcessors -sum).Sum$PhysicalCPU = ($Processors | Measure-Object -Property NumberOfCores -sum).SumSunucu RAM'i
$RamInGb = (Get-wmiobject -ComputerName $Server -Classname win32_physicalmemory -ErrorAction Stop | measure-object -property capacity -sum).sum/1GBSayfa Dosyası Yapılandırması
Sayfa dosyası olup olmadığını kontrol edin, varsa minimum ve maksimum boyutu kontrol edin. Sayfa dosyası sorgusu boş çıkarsa Sayfa dosyası yönetiliyor demektir.
$PageFileCheck = Get-CIMInstance -ComputerName $Server -Class WIN32_PageFile -ErrorAction STOP$Managed = $FalseIf ($Null -ne $PageFileCheck) {$MaximumSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" | select-object MaximumSize).MaximumSize$InitialSize = (Get-CimInstance -ComputerName $Server -Query "Select * from win32_PageFileSetting" | select-object InitialSize ).InitialSize} Else {$Managed = $True}Olay Günlükleri
$Line = EventLog -list | where {($_.log -eq 'Application') -or ($_.log -eq 'system') -or ($_.log -eq 'Security')} |ft Log,MAx*,Over* -auto | Out-File $EventLogConfigurationWindows İşletim Sistemi Bilgileri
$OSName = ($os = Get-WmiObject Win32_OperatingSystem -Namespace "root\CIMV2").Name.split('|')[0]Kullanıcı Posta Kutuları/Kişileri
Exchange Server ortamının önemli bir yönü kişiler ve posta kutuları gibi posta nesnelerinden oluşur. Posta kutusu numaralarını, boyutlarını, arşiv bilgilerini ve daha fazlasını sorgulamak, destek personeli için ölçek duygusu sağlayabileceğinden oldukça faydalı olabilir. Ayrıca bakım, yedekleme, geçiş ve daha fazlası için doğru destek sistemlerinin geliştirilmesine de yardımcı olabilir.
Posta Kutusu İstatistikleri
İlk olarak, kullanıcı posta kutusu istatistikleri için, bilgiyi dışarı aktaracağımız tanımlı bir dosyamız var. Daha sonra, dosya oldukça büyüyebileceğinden (10.000'den fazla kullanıcı ortamını düşünün) bunu ayrı olarak dışa aktarabiliriz.
$MailboxStatDestination = $Path+"\MailboxStatistics.txt"Get-Mailbox -ResultSize Unlimited | Get-MailboxStatistics | Select-Object DisplayName, @{expression = { $_.TotalItemSize.Value.ToMB()};label="Mailbox Size(MB)"} | ft -auto | Out-File $MailboxStatDestinationPosta Kutusu İstatistiklerini Arşivle
Daha sonra, kullanıcının arşiv posta kutusu için aynı kod kümesini çalıştırıyoruz, ancak Get-Mailbox için -Archive anahtarını kullanıyoruz, böylece tüm kullanıcının arşiv posta kutularını sorgulayabiliriz:
$ArchiveMailboxDestination = $Path+"\ArchiveMailboxStatistics.txt"Get-Mailbox -ResultSize Unlimited -Archive | Get-MailboxStatistics | Select-Object DisplayName, @{expression = { $_.TotalItemSize.Value.ToMB()};label="Mailbox Size(MB)"} | ft -auto | Out-File $ArchiveMailboxDestinationİzin Verilen Protokoller
Daha sonra kullanıcıların posta kutuları için kullanabileceği protokoller için Get-CASMailbox cmdlet'ini kullanırız ve bunu önceden tanımlanmış sonuçlar dosyamıza aktarırız:
$CasMailboxDestination = CASMailboxProperties.txtGet-CasMailbox | ft -auto | Out-File $CasMailboxDestinationPosta Kişileri
$MailContactsDestination = ‘MailContacts.txt’$Line = Get-MailContact -ResultSize Unlimited | Ft DisplayName, Alias, EmailAddress, HiddenFromAddressListsEnabled -Auto | Out-File $MailContactsDestinationExchange Yazılımı Ayarları
Temel Exchange Server kurulumunun yanı sıra Exchange Server yazılımında yapılandırabileceğimiz özel ayarlar da bulunmaktadır. Aşağıda PowerShell ile sorgulayabileceğimiz bu konfigürasyonların bazı örnekleri verilmiştir:
E-posta Adresi Politikaları
$Line = Get-EmailAddressPolicy -ErrorAction STOP | Ft Name, RecipientFilterType, Priority ,Enabled*, RecipientFilter, LDAP*, IsValid -Auto | Out-File $Destination -AppendAdres Defteri Politikaları
$Line = Get-AddressBookPolicy | Fl | Out-File $Destination -AppendKimlik Doğrulama Politikaları
$Line = Get-AuthenticationPolicy -ErrorAction STOP | Fl Name,Identity,allow* | Out-file $Destination -AppendKonektörleri Alma
$Line = Get-ReceiveConnector | Ft Identity, Bindings, EnabledAuthMechanism, MaxMessageSize, PermissionGroups, RequireTLS, TransportRole -Auto | Out-file $Destination -AppendBağlayıcıları Gönder
$Line = Get-SendConnector -ErrorAction STOP | Ft Identity, HomeMtaServerId, Enabled, MaxMessageSize, AddressSpaces, CloudServicesMailEnabled, RequireTLS, SmartHosts -Auto | Out-file $Destination -AppendDLP Politikaları
$Line = Get-DLPPolicy | Ft Name,State,Mode,Identity -Auto | Out-File $Destination -AppendRapor Oluşturma
Topladığımız verilerin bir kısmı, veriler daha tüketilebilir bir şekilde temsil edilebildiğinden, HTML raporları olarak daha iyi temsil edilebilir veya diğer insanlara sunulabilir. Belki de raporlama, bir iş süreci için iç/dış kaynaklara denetim bilgileri veya üst düzey mimari bilgileri sağlaması gereken BT Yönetimi tarafından kullanılacaktır. PowerShell ile sorgulanan bilgileri normal CSV çıktı dosyalarından HTML dosyalarına dönüştürebiliriz. Bunu yapmak için pek çok seçenek vardır ve bu makale bu süreç için derinlemesine bir yöntem sunmayacaktır; ancak rapor oluşturma sürecinizde kullanılabilecek üst düzey bir yaklaşımı ele alacağız.
Bu raporda tüm Exchange Sunucuları için NIC bilgilerini sorgulayacağız ve bu, hiçbir sunucunun yapılandırılmış DHCP olmadığından veya çok fazla ağ geçidi veya diğer NIC yapılandırma sorunları olmadığından emin olmak için yapılıyor.
$ExchangeServers = (Get-ExchangeServer).NameForeach ($ExchangeServer in $ExchangeServers) {$Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ExchangeServer -EA Stop | ? {$_.IPEnabled}Foreach ($Network in $Networks) {$IPAddress = $Network.IpAddress[0]$SubnetMask = $Network.IPSubnet[0]$DefaultGateway = $Network.DefaultIPGateway$DNSServers = $Network.DNSServerSearchOrder$WINS1 = $Network.WINSPrimaryServer$WINS2 = $Network.WINSSecondaryServer $WINS = @($WINS1,$WINS2) $IsDHCPEnabled = $falseIf($network.DHCPEnabled) {$IsDHCPEnabled = $true}$MACAddress = $Network.MACAddress$OutputObj = New-Object -Type PSObject$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper()$OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress$OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask$OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value ($DefaultGateway -join ",") $OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled$OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value ($DNSServers -join ",") $OutputObj | FT -auto$Row = "$Computer," + "$IPAddress," +"$SubnetMask," +"$DefaultGateway," +"$ISDHCPEnabled," + "$DNSServers"Add-Content -Path $NICInfoCSVDestination $Row}Tüm bu bilgileri $NICInfoCSVDestination değişkeni tarafından tanımlanan bir CSV dosyasında topladıktan sonra, dosyamız için HTML başlığını burada oluşturmaya başlayabiliriz:
# Define Style for HTML file$OutputFile = "<style>"$OutputFile = $OutputFile + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"$OutputFile = $OutputFile + "TH{border-width: 1px;padding: 2px;border-style: solid;border-color: black;}"$OutputFile = $OutputFile + "TD{border-width: 1px;padding: 2px;border-style: solid;border-color: black;}"$OutputFile = $OutputFile + "</style>"Daha sonra $NICInfoCSVDestination dosyasını dönüştürün ve daha önce tanımladığımız başlığı uygulayın:
# Convert CSV to HTML$Output = Import-Csv -Path $NICInfoCSVDestination$Output | ConvertTo-Html -Head $OutputFile | Set-Content -Path $NICInforHTMLDestinationBu kod bölümü çalıştırıldığında aşağıdaki gibi bir HTML dosyamız olmalıdır:
Yukarıda gördüğümüz şey yine Exchange Sunucusunun Ağ yapılandırmasının özet listesidir ve yapılandırmanın üst düzeyde incelenmesine olanak tanır ve yanlış yapılandırmanın tespit edilmesine yardımcı olur.
Çözüm
Pekala, PowerShell kod parçacıkları yağmurundan kurtulmayı başardınız, tebrikler! Şimdi, parçacıkların hızlı ve kolay oluşturulmasının yanı sıra değerini de görmüş olmanız ve bunun ortamınız için ne kadar değerli olabileceğini görmeye başlayabilmenizi umuyoruz. Bu makalenin kapsamlı olmadığını ve bir blog yazısında bir betiğin tamamını gerçekten yeniden oluşturamayacağımızı unutmayın. Yazdığım bir komut dosyası, Exchange Server'ı belgelemek için 5.000'den fazla satırdan oluşuyor. Sonraki adımlar için gönderiyi okuyup yeniden okuyun, kodu ayırın ve ardından onu belgelemeniz gerekebilecek yapılandırmanın diğer bölümlerine genişletin. Daha sonra uygun bir çıktı dosyası kümesi oluşturun. Son olarak, dokümantasyonun okuyucularını ve tüketicilerini ölçtüğünüzden ve onlara göre ölçtüğünüzden emin olun. Dışa aktarmalar, çok az veya hiç ek açıklama gerektirmeden son derece teknik olabilir veya komut dosyası, yönetici düzeyinde bir rapor için bir eşiğin ilişkilendirilebileceği ve raporlanabileceği bir çeviri gerçekleştirebilir. Akılda tutulması gereken şeyler. Sonuçta bununla ne yapacağınız okuyucuya bağlıdır ve bu da PowerShell'in özgürlüğüdür.



