私の仕事の一環として、クロスドメインアカウントの特定のプロパティについてActiveDirectoryを常に監査しています。
スクリプトに指定されたプロパティに基づいて情報をCSVに出力するPowerShellスクリプトを作成しました。これは問題ありません。スクリプトは少数のユーザーに対しては美しく機能しますが、監査するユーザーのリストを大量に提供すると、スクリプトの速度が大幅に低下することに気付きました。
これはスクリプトです:
$inputfile = "C:\Powershell\input.txt"
$users = Get-Content $inputfile
$audit = Read-Host "Audit Name"
$csv = ".\output\Audit\$audit.csv"
$failed = @()
$serv = @("server1", "server2", "server3")
if((Test-Path $csv) -eq $true){Remove-Item $csv}
foreach($domain in $serv)
{
$count = $users.Count
for( $i=0; $i -le $count - 1; $i++ )
{
if (($users.Get($i)) -ne "")
{
try
{
Write-Host "Checking for $($users.get($i)) on" -NoNewline
switch($domain)
{ # with fancier text for which domain we're searching
"server1" {write-host "...Server1" -ForegroundColor Cyan -NoNewline; $domainCsv = "Server1"}
"server2" {Write-Host "...Server2" -ForegroundColor White -NoNewline; $domainCsv = "Server2"}
"server3" {Write-Host "...Server3" -ForegroundColor Magenta -NoNewline; $domainCsv = "Server3"}
}
$usr = Get-ADUser -Identity $users.get($i) -Properties $properties -Server $domain | ? { ($_.distinguishedname -notlike '*Suspended*')}
if ($usr -ne $null)
{
$usr = Get-ADUser -Identity $users.get($i) -Properties $properties -Server $domain | ? { ($_.distinguishedname -notlike '*Deletion*')}
if ($usr -ne $null)
{
Write-Host "...Found" -ForegroundColor Green
$userobj = New-Object PSObject
Add-Member -InputObject $userobj -MemberType NoteProperty -Name "User" -Value $($users.Get($i))
Add-Member -InputObject $userobj -MemberType NoteProperty -Name "Domain" -Value $domainCsv
foreach($prop in $properties) {$userobj | Add-Member -MemberType NoteProperty -Name $prop -Value "$($usr.$prop)"}
$userobj | Export-Csv $csv -Append -NoTypeInformation
}
else
{
Write-Host "...Pending Delete" -ForegroundColor Red
$failed += "$($users.Get($i)),Pending deletion on $domainCsv"
}
}
else
{
Write-Host "...Suspended" -ForegroundColor Red
$failed += "$($users.Get($i)),Suspended on $domainCsv"
}
}
catch [System.Exception]
{
Write-Host "...Not found" -ForegroundColor Red
$failed += "$($users.Get($i)),Could not find on $domainCsv"
} # </Try
} # </If user ""
} # </For users
} # </For Domains
Add-Content $csv ""
Add-Content $csv "Those who failed, (Not found or Suspended or Pending deletion)"
Add-Content $csv ""
Add-Content $csv "User,Domain"
foreach($fail in $failed) {Add-Content $csv $fail}
Write-Host " "
Write-Host " Audit saved to $csv" -ForegroundColor Green
スクリプトの機能
ユーザーでいっぱいの入力ファイルを取得します(1行に1つの名前)(ほとんどの場合20行程度ですが、入力ファイルが200を超える場合もあります)
user1
user2
user3
user4
user5
各ドメインを通過します
一時停止されたアカウントのOUにあるかどうかを確認します
削除待ちのアカウントのOUにあるかどうかを確認します
どちらにも含まれていない場合、OUは情報を取得し、CSVに挿入するためにPSObjectに配置します
それが行われた後、それはそれが見つけることができなかった、または私が心配する必要のないOUにあったアカウントをリストします。
私はPowerShellにまったく慣れていないので、コードの一部をより速く凝縮できる方法があるかどうかわかりません。PowerShellの最適化について数ページ読んだことがありますが、確認できる唯一の変更は変更でした。
for( $i=0; $i -le $users.count - 1; $i++ )
に
$count = $users.count
for( $i=0; $i -le $count - 1; $i++ )
私の質問は次のとおりです。より多くのユーザーが与えられたときに、スクリプトを改善してループを高速化するにはどうすればよいですか?
私が理解している限り、あなたのスクリプトはほとんどの時間をで過ごしましたGet-ADUser
。同じパラメータで2回呼び出します。$ usrを使用して1回だけ呼び出す必要があり、スクリプトの実行時間は2で割る必要があります。
もう1つ$properties
、スクリプトでの定義が見つかりません。このリストを減らすと、ネットワークペイロードも減る可能性があります。
このようなものをテストします。
$usr = Get-ADUser -Identity $users.get($i) -Properties $properties -Server $domain | ? { ($_.distinguishedname -notlike '*Suspended*')}
if ($usr.distinguishedname -notlike '*Suspended*')
{
if ($usr.distinguishedname -notlike '*Deletion*')
{
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加