Skip to content

Instantly share code, notes, and snippets.

@masyanru
Created February 19, 2020 13:18
Show Gist options
  • Save masyanru/2d8c545f43bbfcad66c79d988acda2fa to your computer and use it in GitHub Desktop.
Save masyanru/2d8c545f43bbfcad66c79d988acda2fa to your computer and use it in GitHub Desktop.
OveflowTestforADDS.ps1
# Тест на исчерпание ресурсов AD на создание новых объектов (в данном случае объектов типа User) в AD.
# Разработчики:
# Илгиз Мамышев, mamyshev@outlook.com
# Александр Станкевич, Stanvy@stanvy.com
# v24.08.2017 upd 14.12.2019
$iStartNumber = 1
$iEndNumber = 500000000
$iItemsProcessed = 0 # Уже обработано объектов
$strUserNamePrefix = "OTU1_" # OverflowTestUser
$strDescription = "Test overflow"
$StorageObjectName = "OverflowTestData1"
$StorageObjectNameDescription = "Объект для хранения результатов теста на исчерпиние ресурсов AD. Исследует: mamyshev@webzavod.ru . Эксперимент начат 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