ActiveDirectory監査スクリプトを最適化する

ブルーケーキ

私の仕事の一環として、クロスドメインアカウントの特定のプロパティについて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++ )

私の質問は次のとおりです。より多くのユーザーが与えられたときに、スクリプトを改善してループを高速化するにはどうすればよいですか?

JPBlanc

私が理解している限り、あなたのスクリプトはほとんどの時間をで過ごしました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]

編集
0

コメントを追加

0

関連記事

分類Dev

AzureNSG用にPowershellスクリプトを最適化する

分類Dev

PHPスクリプトを最適化する

分類Dev

スクリプトの速度を最適化する方法は?

分類Dev

バッチスクリプトを最適化する

分類Dev

"return false" がスクリプトを最適化する方法

分類Dev

jsでスクリプトを最適化する方法は何ですか?

分類Dev

正規分布を計算するNumPyスクリプトの最適化

分類Dev

他のスクリプトから最適化モードでPythonスクリプトを実行する

分類Dev

mysqlリクエストを最適化する方法は?

分類Dev

テキストを検索するクエリの最適化

分類Dev

リモート監視と管理をスクリプト化する方法

分類Dev

詩をインストールしたPythonスクリプトを最適化モードで実行する

分類Dev

FortifyAuditWorkbench-監査プロジェクトをマージする

分類Dev

レジストリ監査ルールを削除する方法は?

分類Dev

大きな圧縮ファイルを検索するスクリプトを最適化する

分類Dev

ログファイルを色付けするためのスクリプトを最適化する方法

分類Dev

Prologスクリプトの最適化

分類Dev

内部の選択を使用するリクエストを最適化する

分類Dev

Excelマクロでクリップボードからのコピーペーストを最適化する

分類Dev

Elasticsearch:スクリプト関数のソースパラメーターを最適化する方法は?

分類Dev

パフォーマンスの観点からスクリプトを最適化する方法

分類Dev

C#でメモリを最適化するためのベストプラクティス

分類Dev

4 ** k回実行されるPythonスクリプトを最適化する方法は?

分類Dev

最適化されたrequire.jsを使用して外部スクリプトをロードする方法は?

分類Dev

.gs検索と置換スクリプトを最適化しますか?

分類Dev

Haskellの「リスト」インデックスを最適化する

分類Dev

複数のsed置換用にシェルスクリプトを最適化する

分類Dev

GNUパラレル用にスクリプトコードを最適化する

分類Dev

大きなファイル用にawkスクリプトを最適化する

Related 関連記事

  1. 1

    AzureNSG用にPowershellスクリプトを最適化する

  2. 2

    PHPスクリプトを最適化する

  3. 3

    スクリプトの速度を最適化する方法は?

  4. 4

    バッチスクリプトを最適化する

  5. 5

    "return false" がスクリプトを最適化する方法

  6. 6

    jsでスクリプトを最適化する方法は何ですか?

  7. 7

    正規分布を計算するNumPyスクリプトの最適化

  8. 8

    他のスクリプトから最適化モードでPythonスクリプトを実行する

  9. 9

    mysqlリクエストを最適化する方法は?

  10. 10

    テキストを検索するクエリの最適化

  11. 11

    リモート監視と管理をスクリプト化する方法

  12. 12

    詩をインストールしたPythonスクリプトを最適化モードで実行する

  13. 13

    FortifyAuditWorkbench-監査プロジェクトをマージする

  14. 14

    レジストリ監査ルールを削除する方法は?

  15. 15

    大きな圧縮ファイルを検索するスクリプトを最適化する

  16. 16

    ログファイルを色付けするためのスクリプトを最適化する方法

  17. 17

    Prologスクリプトの最適化

  18. 18

    内部の選択を使用するリクエストを最適化する

  19. 19

    Excelマクロでクリップボードからのコピーペーストを最適化する

  20. 20

    Elasticsearch:スクリプト関数のソースパラメーターを最適化する方法は?

  21. 21

    パフォーマンスの観点からスクリプトを最適化する方法

  22. 22

    C#でメモリを最適化するためのベストプラクティス

  23. 23

    4 ** k回実行されるPythonスクリプトを最適化する方法は?

  24. 24

    最適化されたrequire.jsを使用して外部スクリプトをロードする方法は?

  25. 25

    .gs検索と置換スクリプトを最適化しますか?

  26. 26

    Haskellの「リスト」インデックスを最適化する

  27. 27

    複数のsed置換用にシェルスクリプトを最適化する

  28. 28

    GNUパラレル用にスクリプトコードを最適化する

  29. 29

    大きなファイル用にawkスクリプトを最適化する

ホットタグ

アーカイブ