.

Can's Windows Server Blog

Deploying new Domains

Domainler ve subdomainler bölge ve/veya departman ve/veya çeşitli sebeplerle bölünebilirler.

Örneğin sirket.com domain’i satıs.sirket.com , uretim.sirket.com, sonrada lokasyonlar ile ankara.uretim.sirket.com, hatay.uretim.sirket.com gibi bölünebilirler.

bu durumda child domain oluşturmuş oluruz. Contigous namespace

Ama bazen domain isimlerinde devamlılık olmaz. O zaman tree domain olur.

sirket.com ve musteri.com gibi tamamen bağımsız bir domain adı da kullanabiliriz. Buna da discontigous domain namespace denir.

Powershell de ise

Install-addsdomain -domaintype TreeDomain -parentdomainname sirket.com -newdomainname msuteri.com -credential domain\administrator

AD Functional Levels

Forest functionla levelları Windows 2000’den başlar. Forest Functional Level 2006 olsun dediğimiz anda bilmemiz gereken o forest içinde artık tüm DC’ler minimum 2016 olmak zorundadır.

Aynı şey domain functional level içinde geçerlidir.

Eğer functional leveli yükseltirsek ve hala eski versiyon DC’ler mevcutsa bu durum onları disable yapacaktır.

AD Users and Computers da Domain e sağ tıklayıp aşağıda ki gibi level i yükseltebiliriz.

Forest functional level için ise AD Domains and Trusts a gitmemiz gerekiyor.

Domain yapısı ve limitleri hakkında

Sis DC oluştururken bazı konuları değerlendirmemiz gerekir. Örneğin forest mı olacak tek domain mi? Replication Lan mı Wan mı? Wan ne kadar hızlı yeterli mi?

Kimler yönetecek? Tek merkezden mi, çok merkezden mi?

GPO uygulaması. GPO Domain seviyesinde uygulanıyor. Güvenlik için herkesin uyması gereken GPO’larım olabilir?

Auditing domain seviyesinde trouble shooting ve resource planning de daha kolay olur mu?

Çok forest olunca güvenlik sıkıntı olur mu? Trusts ?

Schema replication tüm forestlar da geçerli olacak mı?

Global catalog replication?

bir domain içinde replikasyon muhtemelen her 5 dakikada bir olacaktır. bu nedenle uzak yerler seçerken bağlantım yeterince hızlımı onu değerlendirmeliyim.

birden çok domain namespace kullanıyor olabirim. (bizim şirket gibi)

Lokasyonlar çok parçalı ise yönetimi kim yapacak?

Empty domain root : bu yapılırsa hiç bir domain diğerine üstün olmaz. O zaman enterprise admin olmayacağı için tek bir yönetici tüm domainleri etkileyemez.

En önemli konulardan biri … en basiti en iyisidir.

Çoklu forestlarda

güvenlik izolasyonu sağlanabilir.

Bir lokasyondan veri çıkmasını engellemek mümkün olabilir.

Farklı schema lar kullanılabilir.

Firma birleşmeleri olmuş olabilir.

Active Directory Recovery (Authoritative Restore)

Herhangi bir restore için önce backup almak gerekir. Backup almanın bir yoluda Windows Server ile gelen Windows Backupdır. Bunu feature olarak yükleyip backup alıyoruz.

Maalesef detayları eğitimde hiç yoktu. Ancak NTDSUTIL ile yapılıyordu. Sadece bir screenshot mevcuttu.

ntdsutil: activate instance ntds
ntdsutil: authoritative restore
authoritative restore: restore object “cn=Can B, OU=Audit, OU=Satis,DC=can DC=com”
Opening DIT Database….Done
The Current Time is 08.10.2019 05:23
Most recent database update occured at 07.10.2019 11:34.03
Increasing attribute version numbers by 100000.

Counting records that need updating….
Records found: 0000000001
Done.

Found 1 records to update.

Updating records…..
Records remaining: 0000000000000
Done.

Authoritative Restore completed successfully

Koyu renkliler sistem tarafından yazılanlar.

Özellikle önemli olan version numarasının yükseltilmesi. Yani DC’miz networkte ki diğer DC’lere diyorki bunu silmedim update ettim artık bu bilgiyi kullanın.

Active Directory Recovery (Recycle Bin)

DC’de silinen verileri kurtarmanın bir yolu Authoritative Restore ancak bunu yapmak icin DC yi offline yapmak gerekiyor.

Diğer bir yöntem ise AD Recycle Bin. Bu yöntemi kullanmak için önce Recycle Bin özelliğinin aktif edilmesi gerekmektedir. Aktif edildikten sonra de-aktif edilemez.

Herhangi bir obje silindiğinde AD den silinir ancak recycle bin e gider.

Aktif etmek için AD Administrative Center’da

Denemek için bir obje oluşturup sildim.

AD Administrative center’da dedomain altında “deleted objects” diye bir bölüm belirmişti oraya bakıyorum.

FSMO Transferi

Evet bir VM’de ki 6 aylık periyot sona eriyor bu nedenle yeni DC ye ihtiyacım var. İlk DC’yi kapatacağım için FSMO’ları diğerine aktarmam lazım ki domain çalışmaya devam etsin.

DC2 yi daha önce yaratıp DNS ile kurdum ve domain e ekledim. Dolayısıyla zaten replikasyon tamamlanmıştı. Tüm masterları tek bir komutla direk (ve hatta şap diye) aktardım

PS C:> Move-ADDirectoryServerOperationMasterRole -Identity C1-DC2 -OperationMasterRole PDCEmulator, RIDMaster, InfrastructureMaster, SchemaMaster, DomainNamingMaster

Sonra da kontrol ettim çünkü çok hızlı oldu 🙂 gerçi içinde neredeyse 3-5 obje olan dandikr bir domain bu ya neyse 🙂

Sonra gelen ekranda 3 tane Rolü görüyoruz. Powershell ile değilde GUI üzerinden bu 3 rolü buradan da aktarabilirdik.

Diğer ikisini tekrar zaman olunca incelemek lazım.

Şimdi C1-DC1 i domainden adam gibi çıkartma kısmı kaldı.

Önce replikasyon doğru olmuşmu kontrol ediyoruz.


sonra sırada bekleyen bitmemiş replikasyon var mı ona bakıyoruz.

bir daha bakıyoruz son replikasyon ne zaman yapılmış

mesela uzun zamandır olmamışsa bir daha başlatıyoruz

artık ilk DC’yi silebiliriz.

ama olmuyor.

DCpromo yapmamız gerekiyor.

Hemen ilk server a tekrar bağlanıyoruz. Server manager dan remove role yapıyoruz.

Demote this domain controller.

Yine olmadı çünkü FSMO dışında Global Katalog ve DNS hala DC1 de kalmış şimdi onları aktaracağız.

DC2’de Server manager AD Sites and Servicesi açtım.

GC olmasını istediğim serveri Default-First-Site-Name’de buldum ve NTDS Özelliklerini açıyorum. DC2’de Global Catalog un seçili olduğunu DC1’de ise seçili olmadığı durumu sağlıyorum. Hangisinde değişiklik yaptıysam o Serverı restart etmem gerekiyor.

DC leri çoğaltmak

Eğitim amacıyla kullandığım Server 2016 nın 6 aylık ücretsiz lisansı bitmek üzere. Bu nedenle ikinci bir DC kurup FSMO ve tüm ayarlarımı ona aktarıp. yeni bir 6 aylık süreci başlatmak istiyorum.

Bu nedenle önce HyperV üzerinde VM klonladım.

Kendi notlarımı kullandım. https://win.buyukburc.de/2019/03/27/hyper-v-de-vmlerin-cogaltilmasi/

Yeni makinayı çalıştırdıkltan sonra Computername, domain ve network ayarlarını yaparken “SID aynı sysprep ı tekrar çalıştır” hatası ile karşılaştım.

Sysprep i görüldüğü şekilde çalıştırıp, reboot ettim.

Sonra Ip (192.168.0.201)yi ve DNS’i mevcut DC1 (192.168.0.200) olacak şekilde girip sistemi domain e ekliyorum aşağıda ki gibi.

Burada yazanlar maalsef olmadı. Server 2016 başlamadı adam gibi siyah ekranda kilitlendi login olduktan sonra bu nedenle yeniden kurdum.

Active Directory Recovery (snapshot)

AD DS veritabanı bazı dosyalardan oluşur.

Dosya
* ntds.dit
* edb*.log
* ebd.chk

*edbres00001.jrs

Tanım
* AD Objectleri ve bölümlerini tutar
* Transaction Logs
* Database Check Noktası (hangi loglar yazıldı hangileri yazılmadı
* Log dosyası reservasyonu. Eğer disk dolarsa sistem kilitlenmesin diye bu reserve alana yazmaya devam eder.

AD recovery yapabilmek için mutlaka backup olması gerekir. Bir diğer yöntemde varsa snapshot kullanmaktır. Snapshot ntdsutil ile alınır ve CMD yi administrator olarak çalıştırmanız gerekir.

burada önemli olan bilmediğiniz zaman ? ile yardım bulabilmenizdir.

NTDS AD DS kurulumu ile beraber gelir ve çok etkili bir tooldur.

bu komutları çalıştırırken oluşturulan snapshot a bir GUID atandı. Onu kaydetmemiz gerekiyor.

ama listeleyedebiliriz.

Videoların bu kısmı biraz kopuk !!! snapshot i nasıl nereye mount etti nasıl taşıdı göstermedi. !!

Neyse aynı makine üzerinde mount etmek için

takiben bu mount ettiğimiz db yi import etmemiz gerekiyor

Daha sonra AD DS GUI üzerinde inceleyebiliriz.

Sonra gelen pencereyi editliyoruz ve <Type a Directory……..> yazan yeri

yapıp. OK diyoruz. Not : Port numarasına dikkat daha önce kullandığımız port numarası.

Böylece snapshot geri geliyor. Tabii burdan veri kurtarma veya bunu aktif DS nasıl yapılır ??

Başka DC sistemine bu nasıl taşınır video da anlatılmamıştı. Muhtemelen Mount edip dosyaları zip leyip baska yere taşıyıp sonra orada tekrar mount edebiliriz ama denemek lazım deneyimle.

yine de daha sonra CTRL-C ile DSAMain.exe yi durduruyoruz ve snapshot i unmount ediyoruz.

Gerisini video da anlatmadı fazla.Ancak diger toollara geçtik.

Active Directory Group MSA

Group MSA ile bir security hesabını alıp birden çok sisteme koymamızı sağlar. Böylece birden çok bilgisayar aynı service hesabını kullanabilir.

AD nin minimum server2012 olması gerekli ve “KDS Root Key” diye birşeyin oluşturulması gerekli.

KDS Root Key oluşturulması aşağıda ki gibidir.

Add-KdsRootKey -EffectiveTime ((get-date).addhours(-10))

KDS Root Key oluşturulması bazı durumlarda 10 saat kadar sürebilir. Komutta ki “((get-date).addhours(-10))” kısım ile derhal hemen oluştur diyoruz.

New-ADServiceAccount
Add-ADComputerServiceAccount

New-ADServiceAccount ile bir servis hesabı oluşturup daha sonra ki komutlada bu hesabı bilgisayara atıyoruz. Kontrol etmek içinde Get-ADServiceAccount ile görebiliriz.

New-ADServiceAccount -Name AnkaraSPFarm -PrincipalsAllowedToRetrieveManagedPassword ANKSP1, ANKSP2, ANKSP3

komuta eklenen parametre ile belirlediğimiz serverlar AD üzerinden bu hesabın parolasına erişme yetkisi verebiliriz.

Daha sonra her bir SP serverında

Add-ADComputerServiceAccount

Komutunu çalıştırıyoruz.

Excel Script

Excel ile ilgili bazı işlemleri içeren bir script yazmıştım bir kısmını kapatacağım isimler burada kullanmaya uygun olmadığından.

##################################

# um mit diesem Skript zu arbeiten, sollten zunächst alle CSV-Dateien in den gleichen Ordner mit diesem Skript kopiert werden.
# auch die Reporting-Excel-Datei (HEX-Mailboxes_final.xlsx) vom Vormonat sollte ebenfalls hier sein.
# Hinweis: muss überprüfen, ob keine der CVS-Dateien 1kb Daten enthält (als wäre es eine falsche heruntergeladene Datei).
# Nachdem das Skript ausgeführt wurde, können CSV-Dateien gelöscht werden.
##################################
#
#19.07.2019
#
#################################
### Erst Excel Aktualisierung
#################################
$pwdd = (Get-Location).Path
$Excel = New-Object -ComObject excel.application
$Excel.visible = $false
$pathh = $pwdd+"\HEX-Mailboxes_final.xlsx"
$Workbook = $excel.Workbooks.open($pathh)
$Worksheet = $Workbook.WorkSheets.item(“Tabelle1”)
$worksheet.activate() 
$range = $WorkSheet.Range(“B2:D5”)
$range.copy()
$Range2 = $Worksheet.Range(“I2:K5”)
$Worksheet.Paste($range2) 
########################################
### Counts in Variables
#######################################
$CSVs = Get-ChildItem -Recurse |where {$_.Extension -eq ".csv"} | % { $_.FullName }
$Dog2010basic = $CSVs|Select-String "dohex2010-results-ex2010-basic"
$Dog2010Standard = $CSVs|Select-String "dohex2010-results-ex2010-standard"
$dog2013basic = $CSVs|Select-String "basic_sal"
$dog2013standard = $CSVs | Select-String "standard_sal_"
$dog2013ent = $CSVs|Select-String "enterprise_sal"
$Simple2010Stand = $CSVs | Select-String "Simple-results-ex2010-standard-sal"
$Simple2010Basic = $CSVs | Select-String "Simple-results-ex2010-basic-sal"
$simple2013all = $CSVs | Select-String "results-ex2013"
###############
$Dog2010basicCsv = Import-Csv $Dog2010basic -Delimiter ";"
$Dog2010basicCount = ($Dog2010basicCsv| where { $_.whencreated -ne "" } |Measure-Object).count
###############
$Dog2010StandardCsv = Import-Csv $Dog2010Standard -Delimiter ";"
$Dog2010StandardCount = ($Dog2010StandardCsv| where { $_.whencreated -ne "" } |Measure-Object).count
###############
$dog2013basicCSV = Import-Csv $dog2013basic -Delimiter ","
$dog2013basicCount = ($dog2013basicCSV | where { $_.whencreated -ne "" } |Measure-Object).count
###############
$dog2013standardCsv = Import-csv $dog2013standard -Delimiter ","
$dog2013standardCount = ($dog2013standardCsv | where { $_.whencreated -ne "" } |Measure-Object).count
###############
$dog2013entCsv = Import-csv $dog2013ent -Delimiter ","
$dog2013entCount = ($dog2013entCsv  | where { $_.whencreated -ne "" } |Measure-Object).count
###############
$Simple2010StandCsv = Import-Csv $Simple2010Stand -Delimiter ";"
$Simple2010StandCount = ($Simple2010StandCsv | where { $_.whencreated -ne "" } |Measure-Object).count
###############
$Simple2010BasicCsv = Import-Csv $Simple2010Basic -Delimiter ";"
$Simple2010BasicCount = ($Simple2010BasicCsv | where { $_.whencreated -ne "" } |Measure-Object).count
###############
$simple2013CSv = Import-Csv $simple2013all -Delimiter ";"
$simple2013BasicCounter  = ($simple2013CSv | where { $_.whencreated -ne "" -and $_.MapiEnabled -eq "False" -and $_.IsResource -eq "False" } |Measure-Object).count
$simple2013StandCounter  = ($simple2013CSv | where { $_.whencreated -ne "" -and $_.MapiEnabled -eq "True"} |Measure-Object).count
####################################
### Variables in Excel-Cells
### item(Numbers,Letters (but used as number)
####################################
$worksheet.Cells.item(2,2)= $Simple2010BasicCount
$worksheet.Cells.item(2,3)= $Simple2010StandCount
$worksheet.Cells.item(2,4)= "0"
$worksheet.Cells.item(3,2)= $simple2013BasicCounter
$worksheet.Cells.item(3,3)= $simple2013StandCounter
$worksheet.Cells.item(3,4)= "0"
$worksheet.Cells.item(4,2)= $Dog2010basicCount
$worksheet.Cells.item(4,3)= $Dog2010StandardCount
$worksheet.Cells.item(4,4)= "0"
$worksheet.Cells.item(5,2)= $dog2013basicCount
$worksheet.Cells.item(5,3)= $dog2013standardCount
$worksheet.Cells.item(5,4)= $dog2013entCount
####################################
#### Excel save
####################################
$workbook.save()
$Excel.Quit()
Remove-Variable -Name excel
[gc]::collect()
[gc]::WaitForPendingFinalizers()

Şimdi öncelikle amacı ve ne olduğunu açıklayayım.

Exchange Server üzerinde her bir müşteri tipinin detaylarını bir skript ile CSV dosyalarına atıyoruz. Takiben yine aynı skript bunları maıl atıyor. Bizde birden çok platform ve birden çok müşteri hizmeti var. Her platformda bunlar koşuyor ve mail olarak bizde toplanıyor. Gelen tüm maillerde ki CSV eklentileri bir folderda topluyoruz. ve Bu scripti orada koşuyoruz.

Şimdi blokları inceleyelim

Excelde Copy Paste

$worksheet.activate() 
$range = $WorkSheet.Range(“B2:D5”)
$range.copy()
$Range2 = $Worksheet.Range(“I2:K5”)
$Worksheet.Paste($range2) 

Burada ki en önemli kısım excelde sol üst sağ alt köşe tanımlanarak copy paste ediliyor.

CVS ye get-content

Get-conten ama biraz farklı ; her bir tip elemanı bir object attribute olarak almasını sağlıyoruz. Örneğin whencreated diye bir değer var her satırda.

$dog2013entCsv = Import-csv $dog2013ent -Delimiter ","
$dog2013entCount = ($dog2013entCsv  | where { $_.whencreated -ne "" } |Measure-Object).count

$dog2013entCsv|fl yaptığımızde detayları ve seçilebilir attribleri görüyoruz. whencreted boş olmayanları sayıyoruz.

 ($dog2013entCsv  | where { $_.whencreated -ne "" } |Measure-Object).count

Bu sayıyı bir değişkene atadıktan sonra excelde bir hücreye atıyoruz. Burada önemli nokta ise normalde excelde bir hücre B3 gibidir oysa bu komutta (Nedense !!!) biraz ters işlemişler önce 3B sonrada B yi de rakam olarak yazmışlar yani 2 kısaca 3,2

item(Numbers,Letters (but used as number)
$worksheet.Cells.item(2,3)= $Simple2010StandCount