Eksik Alt Ağları bulmak için netlogon.log'u PowerShell kullanarak ayrıştırın
Active Directory, bir bilgisayarın topolojinin neresinde bulunduğunu tanımlamak ve böylece belirli hizmetler için hangi sunucunun kullanılması gerektiğini belirlemek için Sites'ı kullanır. Örneğin siteler, bir istemcinin oturum açma sunucusu olarak hangi Etki Alanı Denetleyicisini kullanması gerektiğini belirlemek için kullanılır ve eğer müşterilerimden biri Avustralya'daki bir sitede oturum açarsa muhtemelen ABD'deki bir Etki Alanı Denetleyicisinden Grup İlkelerini işlemesini istemiyorum. .
Bu nedenle Active Directory'de her sitenin bir veya daha fazla alt ağ ile ilişkili olduğu ve hayatın güzel olduğu siteleri tanımlıyoruz. Peki belirli bir alt ağı tanımlamayı unutursak veya aniden yeni bir alt ağ kullanılırsa ne olur? Bir bilgisayar bir siteye atanmadan Active Directory'ye bağlanırsa, bu beklenmeyen davranışlarla sonuçlanabilir.
Bu süreç hakkında daha fazla ayrıntı için bu bağlantıda mükemmel bir blog yazısı bulunmaktadır: http://jorgequestforknowledge.wordpress.com/2011/01/27/dc-locator-what-does-quot-no-client-site- netlogon-günlüğündeki-quot-anlamına gelir/
Tanımlanmamış herhangi bir alt ağdaki bilgisayarların varsayılan site kullanmasını sağlamanın harika bir yolu, "tümünü yakala" alt ağlarını kullanmaktır. Bir bilgisayarın ip adresi birden fazla alt ağla eşleşiyorsa, en spesifik eşleşme kazanır; bu, Site1'e 10.1.1.0/24 ve Site2'ye 10.1.2.0/24 atayabileceğim ve ardından herhangi bir adresi yaparak Site1'e 10.1.0.0/16 atayabileceğim anlamına gelir. Bu kapsamda tanımlanan başka bir alt ağla eşleşmeyen site1 ile ilişkilendirilecektir.
Ancak bu yazı, alt ağların neden, tanımlanıp tanımlanmaması gerektiği veya nasıl tanımlanması gerektiği ile ilgili değildir. Active Directory'de tanımlanmadan istemcilerin hangi alt ağları kullandığını bulmakla ilgilidir. Bu alt ağları bulmak için (bundan sonra "eksik alt ağlar" olarak anılacaktır), her Etki Alanı Denetleyicisindeki netlogon.log dosyasını incelememiz ve NO_CLIENT_SITE hata mesajını aramamız gerekir.
Satırın ilk kısmı bir zaman damgası olacaktır (zaman damgası devre dışı bırakılmamışsa) ve istemci bilgisayarın adı ve IP adresi satırın en sonunda listelenecektir. Bu, büyük ortamlarda oldukça hantal bir görev olabilir, bu nedenle, çeşitli etki alanı denetleyicilerinden netlogon.log günlüklerinin son bölümünü toplamak ve NO_CLIENT_SITE'ı aramak için bir komut dosyası yazdım. Ayrıca her satırdan zaman damgasını, bilgisayar adını ve IP Adresini çıkaracak ve bunu kolay sıralama ve/veya filtreleme için özel bir PSObject olarak döndürecektir. Netlogon.log'un zaman damgası herhangi bir nedenle etki alanı denetleyicilerinizden herhangi birinde devre dışı bırakıldıysa -IncludeTimestamp parametresini $false olarak ayarlayın. Betik oldukça basit; geçerli etki alanındaki tüm etki alanı denetleyicilerini -DomainControllers için varsayılan değer olarak aşağıdaki kodla numaralandırıyorum:
([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).DomainControllers.NameDaha sonra iki fonksiyon yazdım, ilki Get-Content'i -Tail parametresiyle kullanarak her etki alanı denetleyicisinden netlogon.log günlük dosyasındaki son (n) satır sayısını alıyor ve her satırı boru hattına gönderiyor.
İkinci işlev, boru hattından gelen sokmaları kabul eder. Bu fonksiyonda ilk olarak Begin{} bloğunda IncludeTimestamp parametresine bağlı olarak bir normal ifade tanımladım. Bu model daha sonra analiz edilen her satırla eşleştirilir. Desenimle eşleşen her satırdan ilgimi çeken bilgiyi çıkarmak için Adlandırılmış Gruplar adı verilen bir şey kullanıyorum. Kısacası, normal ifadede parantez içine alınan her şey bir grup olarak kabul edilir ve PowerShell'de -match operatörü kullanıldığında $matches otomatik değişkenine doldurulur.
Daha sonra her gruba $matches[index] kullanılarak erişilebilir; burada indeks, grubun 1'den başlayan indeks numarasıdır. $Matches[0] her zaman eşleşen dizenin tamamını içerecektir. Ancak, özellikle iç içe geçmiş gruplarınız varsa, her bir grubun indeksini takip etmek oldukça sinir bozucu hale gelir. Adlandırılmış Gruplar adı verilen bu soruna harika bir çözüm var.
İlk parantezden hemen sonra '?
Bir grup insana kendilerini beş cümleyle sunma görevi veriliyor. Herkesin ismini yazacağını ve muhtemelen “name is” ön ekini ekleyeceğini varsayıyoruz. Bunun için her cümleyi bir kalıpla eşleştirelim.
$Pattern = “name is (?<name>w+)”Bu, "ad" ifadesini arayacak ve ardından herhangi bir alfasayısal karakter veya alt çizgi için normal ifade olan w ve alfasayısal karakterin (veya alt çizginin) bir veya daha fazla kez görüneceği anlamına gelen + gelecektir. Maçımızın parantez içindeki kısmı “isim” isimli gruptur.
Şimdi bir cümleyi eşleştirmek şöyle görünebilir:
”My name is Simon” -match $PatternBu, True değerini döndürecek ve $matches otomatik değişkenini dolduracaktır. $matches'ı Get-Member'e ileterek incelemek, $matches'in bir hashtable olduğunu gösterecektir. Adlandırılmış grubu eşleşen cümleden çıkarmak için hash tablosundan 'name' anahtarının değerini kolayca alabiliriz:
$Matches[“name”]Eşleştirme tamamlandıktan sonra sonucun döndürülmesi, çıktıya yazılan bir PSCustomObject oluşturularak yapılır.