Created
February 19, 2020 13:18
-
-
Save masyanru/2d8c545f43bbfcad66c79d988acda2fa to your computer and use it in GitHub Desktop.
OveflowTestforADDS.ps1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Тест на исчерпание ресурсов AD на создание новых объектов (в данном случае объектов типа User) в AD. | |
# Разработчики: | |
# Илгиз Мамышев, [email protected] | |
# Александр Станкевич, [email protected] | |
# v24.08.2017 upd 14.12.2019 | |
$iStartNumber = 1 | |
$iEndNumber = 500000000 | |
$iItemsProcessed = 0 # Уже обработано объектов | |
$strUserNamePrefix = "OTU1_" # OverflowTestUser | |
$strDescription = "Test overflow" | |
$StorageObjectName = "OverflowTestData1" | |
$StorageObjectNameDescription = "Объект для хранения результатов теста на исчерпиние ресурсов AD. Исследует: [email protected] . Эксперимент начат 21.06.2017" | |
$strTargetDomainFQDN = "DOMAIN.local" | |
$strTargetContainerDN = "CN=Users,DC=DOMAIN,DC=LOCAL" | |
$strTargetADObjectClassName = "user" | |
$strTargetObjectRelativeIdentifier = "CN" | |
try | |
{ | |
$strTargetADObjectADsPath = "LDAP://" + $strTargetDomainFQDN + "/" + $strTargetContainerDN | |
$objTargetContainer = New-Object -TypeName System.DirectoryServices.DirectoryEntry($strTargetADObjectADsPath) | |
$objTargetContainer.RefreshCache("distinguishedName") | |
} | |
catch | |
{ | |
Write-Error ("Specified container doesn't exist.") | |
Exit | |
} | |
$strStorageADObjectADsPath = "LDAP://" +$strTargetObjectRelativeIdentifier + "=" + $StorageObjectName + "," + $strTargetContainerDN | |
$objStorageADObject = New-Object -TypeName System.DirectoryServices.DirectoryEntry($strStorageADObjectADsPath) | |
# Начальное значение счетчика | |
# Проверим, есть ли хранилище данных теста | |
try | |
{ | |
$objStorageADObject.RefreshCache("givenname") | |
#Exists | |
$bStorageObjectExists = $true | |
} | |
catch | |
{ | |
#Doesn't exists | |
$bStorageObjectExists = $false | |
} | |
if ($bStorageObjectExists) | |
{ | |
# считаем последнее значение счетчика | |
if (![System.Int32]::TryParse($objStorageADObject.Properties["givenname"][0], [ref] $iItemsProcessed)) | |
{ | |
$iItemsProcessed = 0 | |
} | |
}else | |
{ | |
try | |
{ | |
# создадим объект, запишем счетчик | |
$strStorageObjectRelativeDN = $strTargetObjectRelativeIdentifier + "=" + $StorageObjectName | |
$objStorageADObject = $objTargetContainer.Children.Add($strStorageObjectRelativeDN, $strTargetADObjectClassName) | |
$objStorageADObject.Properties["sAMAccountName"].Value = $StorageObjectName | |
$objStorageADObject.Properties["description"].Value = $StorageObjectNameDescription | |
$objStorageADObject.Properties["givenname"].Value = $iItemsProcessed | |
$objStorageADObject.Properties["physicalDeliveryOfficeName"].Value = $StorageObjectNameDescription | |
$objStorageADObject.Properties["userAccountControl"].Value = 514 | |
$objStorageADObject.CommitChanges() | |
} | |
catch | |
{ | |
Write-Error ("Unable to create storage object.") | |
Exit | |
} | |
} | |
$objElapsedTimeStopWatch = [System.Diagnostics.Stopwatch]::StartNew() | |
$iProgressBarUpdateIntervalInMilliseconds = 200 # Интервал съема показаний "секундомера" в миллисекундах | |
$iRIDPoolCountReadIntervalInMilliseconds = 5000 # Интервал перечитывания счетчика RID в миллисекундах | |
$objProgressBarUpdateStopWatch = [System.Diagnostics.Stopwatch]::StartNew() | |
$iCreatedObjectsAmount = 0 # Счетчик созданных В ТЕКУЩЕМ ЗАПУСКЕ объектов | |
$iStorageObjectSaveCount = 0 | |
$iStorageObjectPeriodCount = 50 # Период сохранения счетчика: $iProgressBarUpdateIntervalInMilliseconds * $iStorageObjectPeriodCount | |
# UPD. Уточним значения счетчиков | |
$out = Dcdiag.exe /TEST:RidManager /v | find /i "* rIDNextRID:" | |
$iItemsProcessed = [int]($out -replace '\D+(\d+)','$1') | |
$out = Dcdiag.exe /TEST:RidManager /v | find /i "Available RID Pool for the Domain" | |
$RIDPoolMax = [int]($out -replace '\D+(\d+)+\D+(\d+)','$2') | |
$iEndNumber = $RIDPoolMax | |
$iStartNumber = $iItemsProcessed # Начнем цикл с этого значения | |
$iPreviousItemsProcessed = $iItemsProcessed | |
# Надпись в ProgressBar | |
$strProgressBarActivity = "Creating " + $iEndNumber.ToString() + " objects in """ + $strTargetDomainFQDN + """ domain." | |
# Цикл | |
for ($iUserNumber = $iStartNumber; $iUserNumber -le $iEndNumber; $iUserNumber++) | |
{ | |
# Счетчик | |
if ($objProgressBarUpdateStopWatch.ElapsedMilliseconds -ge $iProgressBarUpdateIntervalInMilliseconds) | |
{ | |
if ($objProgressBarUpdateStopWatch.ElapsedMilliseconds -ge $iRIDPoolCountReadIntervalInMilliseconds) | |
{ | |
# уточнение\пересчет текущего счетчика | |
$out = Dcdiag.exe /TEST:RidManager /v | find /i "* rIDNextRID:" | |
$iItemsProcessed = [int]($out -replace '\D+(\d+)','$1') | |
$iUserNumber = $iItemsProcessed; | |
} | |
$iPercentsCompleted = [System.Math]::Truncate(($iItemsProcessed * 100) / $iEndNumber) | |
$iProgressRate = [System.Math]::Truncate(($iItemsProcessed - $iPreviousItemsProcessed) / $objProgressBarUpdateStopWatch.ElapsedMilliseconds * 1000) | |
$iPreviousItemsProcessed = $iItemsProcessed | |
$iProgressRateAverage = [System.Math]::Truncate(($iUserNumber - $iStartNumber)/$objElapsedTimeStopWatch.Elapsed.TotalSeconds) | |
$strLeftDays = [System.Math]::Round((($iEndNumber-$iUserNumber)/$iProgressRateAverage)/60/60/24,0) | |
$strProgressBarStatus = $iItemsProcessed.ToString() + " of "+ $iEndNumber.ToString() + " (" + $iPercentsCompleted.ToString() + "%) processed so far... Progress rate is " + $iProgressRate.ToString() + " (average "+ $iProgressRateAverage + ") per second." + " Left "+ $strLeftDays + " days." | |
$strTimeElapsed = [System.String]::Format("{0:00}.{1:00}:{2:00}:{3:00}", $objElapsedTimeStopWatch.Elapsed.Days, $objElapsedTimeStopWatch.Elapsed.Hours, $objElapsedTimeStopWatch.Elapsed.Minutes, $objElapsedTimeStopWatch.Elapsed.Seconds) | |
$strProgressBarOperation = "Time elapsed: " + $strTimeElapsed | |
Write-Progress -Activity $strProgressBarActivity -Status $strProgressBarStatus -PercentComplete $iPercentsCompleted -CurrentOperation $strProgressBarOperation | |
# Сохраним счетчик (периодически - один раз за $iStorageObjectPeriod обновлений ProgressBar) | |
if ($iStorageObjectSaveCount -ge $iStorageObjectPeriod) | |
{ | |
try | |
{ | |
#$objStorageADObject.Properties["givenname"].Value = $iUserNumber.ToString() | |
$objStorageADObject.Properties["description"].Value = $strProgressBarStatus | |
$objStorageADObject.CommitChanges() | |
} | |
catch | |
{ | |
Write-Error ("Unable to save data into storage object.") | |
break | |
} | |
$iStorageObjectSaveCount = 0 | |
} | |
$iStorageObjectSaveCount++ | |
$objProgressBarUpdateStopWatch.Reset() | |
$objProgressBarUpdateStopWatch.Start() | |
} | |
$iItemsProcessed++ | |
# Генерируем имя нового объекта | |
$strSAMAccountName = $strUserNamePrefix + $iUserNumber.ToString() | |
$strTargetObjectRelativeDN = $strTargetObjectRelativeIdentifier + "=" + $strSAMAccountName | |
# Создаем объект | |
try | |
{ | |
$objTargetADObject = $objTargetContainer.Children.Add($strTargetObjectRelativeDN, $strTargetADObjectClassName) | |
} | |
catch | |
{ | |
$iItemsProcessed-- | |
$iUserNumber-- | |
$ErrorMessage = $_.Exception.Message | |
$FailedItem = $_.Exception.ItemName | |
Write-Host "ErrorMessage" -ForegroundColor Red | |
$ErrorMessage | |
Write-Host "FailedItem" -ForegroundColor Red | |
$FailedItem | |
#continue | |
break | |
} | |
$objTargetADObject.Properties["sAMAccountName"].Value = $strSAMAccountName | |
$objTargetADObject.Properties["userAccountControl"].Value = 514 | |
try | |
{ | |
$objTargetADObject.CommitChanges() | |
$iCreatedObjectsAmount++ | |
$objTargetContainer.Children.Remove($objTargetADObject) # Удаление объекта после создания | |
} | |
catch | |
{ | |
} | |
$objTargetADObject.PSBase.Dispose() | |
} #for | |
# Ну а сюда мы попадем ой как не скоро.. :) | |
Write-Progress -Activity $strProgressBarActivity -Status "Completed" -Completed | |
$objTargetContainer.PSBase.Dispose() | |
$objStorageADObject.PSBase.Dispose() | |
Write-Output ($iCreatedObjectsAmount.ToString() + " objects have been created in last batch.") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment