Powershell が Active Directory からユーザーをアンロードします。 Active Directory で非アクティブなユーザーを検索する

09.05.2019 ルーターとモデム

MS からすべてのユーザーをアンロードするためのスクリプト アクティブディレクトリ(ITGC)

イワン・ピスクノフ

標準的な監査手順の 1 つ ITGC カタログ用 アクティブディレクトリ すべてのドメイン ユーザーのダウンロードを取得することです。 取得したデータに基づいて、管理者のリストを調査したり、パスワードの有効期限が切れたユーザーを特定したりするなど、テスト手順が作成されます。 このようなアップロードを作成する最も効果的な方法は、標準インターフェイスを使用することです。 パワーシェル 、この記事ではその例を検討します

1. PowerShell スクリプトを使用した高速アップロード

以下であり PowerShell スクリプトは、すべての AD ドメイン ユーザーのリストを CSV 形式で取得する最も簡単かつ迅速な方法の 1 つであり、Excel で問題なく開くことができます。

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = "LDAP://ou=Users,ou=Departmets,dc=test,dc=ru" $objSearcher.Filter = "(&(objectCategory=person) (!userAccountControl:1.2.840.113556.1.4.803:=2))" $users = $objSearcher.FindAll() # アカウント数 $users.Count $users | ForEach-Object ( $user = $_.Properties New-Object PsObject -Property @( Position = $user.description 部門 = $user.Department ログイン = $user.userprincipalname Phone = $user.telephonenumber Room = $user.physicaldeliveryofficename Full名前 = $user.cn ) ) | Export-Csv -NoClobber -Encoding utf8 -Path C: list_domain_users.csv

スクリプトをシステム上で動作させるには、スクリプトを少し修正する必要があります。つまり、必要なパラメータを入力する必要があります。 この例のように、これらはパラメータです ユーザー 部内で 部門 ドメイン内で テスト.ru。 ファイルが保存されている場所へのパスも示します list_domain_users.csv

降ろした後、すぐに開けると list_domain_users.csv 、読みにくく見えますが、標準的な手段を使用すると、必要な形式に簡単に変換できます。 Excelで開く list_domain_users.csv 、最初の列を選択し、「データ」タブに移動して「列ごとのテキスト」をクリックします。 「区切り文字付き」を選択し、「次へ」をクリックします。 準備ができて!

!注意が必要ですこのスクリプトでは 1000 を超えるユーザーは表示されないことを確認します。 これは小規模な企業には非常に適していますが、ドメイン内に膨大な数のユーザーがいる企業の場合は、以下で説明する方法に頼るべきです。

2. Active Directory ユーザーのアップロードを取得するための高度な PowerShell コマンドレット

Windows PowerShell ツール用 Active Directory モジュール (で導入) Windowsサーバー 2008 R2 以降) を使用すると、AD ディレクトリ オブジェクトを使用してさまざまな操作を実行するコマンドレットを作成できます。 このコマンドレットは、ユーザーとそのプロパティに関する情報を取得するために使用されます。 Get-ADUser。

始めること Powershell ウィンドウを起動する 管理者権限を使用して Active Directory モジュールをインポートして、さらにアクションを実行します。
インポートモジュールのアクティブディレクトリ

すべてのドメインアカウントをリストする コマンドを実行しましょう:

Get-ADUser -filter *

撤回する 情報がいっぱい利用可能なすべての属性について ユーザー tuser でコマンドを実行します

Get-ADUser -identity tuser -properties *


たとえば、次のような情報に興味があります。 パスワードの変更日と有効期限が切れる時刻 。 コマンドの結果はテキスト ファイルにエクスポートできます。

Get-ADUser -filter * -properties PasswordExpired、PasswordLastSet、PasswordNeverExpires | ft 名前、PasswordExpired、PasswordLastSet、PasswordNeverExpires > C:tempusers.txt

それともすぐに CSVにアップロードする 、将来的には Excel にエクスポートするのに便利になります (さらに、sort-object を使用して、PasswordLastSet 列でテーブルを並べ替え、Where 条件も追加します。ユーザー名には文字列「Dmitry」が含まれている必要があります)。

Get-ADUser -filter * -properties PasswordExpired、PasswordLastSet、PasswordNeverExpires | ここで ($_.name –like “*Dmitry*”) | 並べ替えオブジェクトの PasswordLastSet | select-object Name、PasswordExpired、PasswordLastSet、PasswordNeverExpires | エクスポート csv -path c:tempuser-password-expires-2015.csv

0

CSV ファイル内のユーザーの大規模なリストが AD グループのメンバーであるかどうかを確認し、結果を results.csv に書き込む次の作業スクリプトがあります。

$group = "InfraLite" を $group = DC .\List_Of_AD_Groups.CSV に変更できるようにスクリプトを変換する方法がわかりません。

したがって、スクリプトは 1 つの AD グループの一致を返すだけでなく、List_of_AD_groups.csv に含まれる 80 個の AD グループの一致を返します。 新しい CSV 列に各 AD グループに対して YES/NO を書き込む (または、これが不可能な場合は、グループごとに結果を含む個別の CSV ファイルを作成することでも同様のことが行われます)。

$group の値とエクスポート ファイル名を変更し、スクリプトを 80 回再実行することでこれを手動で行うこともできますが、これを行うには PS をすばやく使用する必要があります。

たとえば、results.csv?:

名前 AD_GROUP1 AD_GROUP2 AD_GROUP80 など user1 はい いいえ はい user2 いいえ いいえ はい user3 いいえ はい いいえ echo "UserName`InfraLite" >> results.csv $users = GC .\user_list.csv $group = "InfraLite" $members = Get-ADGroupMember -Identity $group -Recursive | -ExpandProperty SAMAccountName foreach ($users の $user) を選択します ( if ($members -contains $user) ( echo "$user $group`tYes" >> results.csv ) else ( echo "$user`tNo" >> results .csv))

  • 2 つの回答
  • 並べ替え:

    活動

0

問題に対する簡単な解決策は、既存のコードを別のループでラップし、グループごとに出力ファイルを作成することです。

$groups = Get-Content "C:\groups.txt" foreach ($groups の $group) ( $members = Get-ADGroupMember ... ...)

より洗練されたアプローチは、グループ マッピング テンプレートを作成し、それをユーザーごとに複製し、そのコピーにユーザーのグループ メンバーシップを設定することです。 次のようなものが機能するはずです。

$template = @() Get-Content "C:\groups.txt" | ForEach-Object ( $template[$_] = $false ) $groups = @() Get-ADGroup -Filter * | ForEach-Object ( $groups[$_.DistinguishedName] = $_.Name ) Get-ADUser -Filter * -Properties MemberOf | ForEach-Object ( $groupmap = $template.Clone() $_.MemberOf | ForEach-Object ( $groups[$_] ) | Where-Object ( $groupmap.ContainsKey($_) ) | ForEach-Object ( $groupmap [$_] = $true ) New-Object -Type PSObject -Property $groupmap ) | エクスポート-Csv "C:\user_group_mapping.csv" -NoType

0

私はしばらくこれで遊んできましたが、あなたが求めていたものを正確に得る方法を見つけたと思います。

アンスガーは正しい軌道に乗っていたと思うが、その後に続くことをさせることができなかった。 彼は、この記事の執筆時点では AD 環境にアクセスできなかったと述べました。

私が思いついたのは次のとおりです。

$UserArray = Get-Content "C:\Temp\Users.txt" $GroupArray = Get-Content "C:\Temp\Groups.txt" $OutputFile = "C:\Temp\Something.csv" # ハッシュテーブルのセットアップ後で使用するには $UserHash = New-Object -TypeName System.Collections.Hashtable # ユーザーとメンバーシップを UserHash に追加する外側のループ $UserArray | ForEach-Object( $UserInfo = Get-ADUser $_ -Properties MemberOf # LPAP 構文をグループの SAMAccountName のみに取り除きます $Memberships = $UserInfo.MemberOf | ForEach-Object( ($_.Split(",")) .replace("CN=","") ) #User=Membership ペアをハッシュに追加 $UserHash.Add($_,$Memberships) ) #ユーザーごとにオブジェクトを作成する外側のループ $Results = $UserArray | ForEach-Object( # まず、 単純なオブジェクト$User = New-Object -TypeName PSCustomObject -Property @( Name = $_ ) # $GroupArray に基づいてメンバーをオブジェクトに動的に追加します。 ForEach-Object ( #$UserHash をチェックしてユーザーのメンバーシップ リストにグループが表示されるかどうかを確認します $UserIsMember = $UserHash.($User.Name) -contains $_#オブジェクトへのプロパティの追加と値 $User | Add-Member -MemberType NoteProperty -Name $_ -Value $UserIsMember ) #オブジェクトを変数に返す Return $User ) #オブジェクトを CSV に変換して出力 $Results |

すべて意味があることを祈りましょう。 できる限りコメントさせていただきました。 これを実行しているマシンに RSAT がインストールされていない場合、ADSI に変換するのは非常に簡単です。 必要な場合はお知らせください。すぐに変更させていただきます。

読者および購読者の皆様、こんにちは。私たちは Powershell と Active Directory の機能について引き続き研究を続けています。 彼女のことをどうやって全部覚えているのですか? アカウントユーザーとコンピュータは NTDS.dit データベース内にあり、すべてが優れており一元化されています。 企業に複数のシステム管理者がいる場合、不要な資格情報が蓄積される状況が発生する可能性があります。 私たちは皆人間であり、いくつかのことを忘れる可能性があり、ある瞬間に気が散ることもあり、それはまた忘れることにつながります 重要な情報。 そして、非アクティブなユーザー (解雇されたか忘れられた) が Actvie ディレクトリに蓄積されるという結論に達しました。いずれにせよ、優れたシステム管理者がそれらのユーザーを特定し、無効にし、必要に応じて削除する必要があります。私たちはそうするつもりです。

ADUC スナップイン経由

前回、アクティブ スナップインの使用例をすでに示しました。 ディレクトリユーザーローカル ネットワーク上で 1 か月間出現しなかった行方不明のコンピュータを探しました。 次に、ユーザー アカウントでも同じことを行います。 Windows Server 2012 R2 上に AD があり、ADUC を開き、WIN+R を押して dsa.msc と入力します。

表示されたリクエスト フォームに次のように入力します。

  • リクエスト名 > 私にとって、これらは失われたユーザーです
  • 必要に応じて説明
  • ルートをリクエスト > ここでドメイン全体を残すことも、目的の OU で指定することもできます

そしてリクエストボタンをクリックしてください。

[ユーザー] タブには、「開始からの日数」という項目が表示されます。 前回のログインシステムでは」たとえば 60 日を設定します。

その結果、非アクティブな従業員アカウントの必要なリストを受け取ります。

PowerShell スナップイン経由

同じことを Powershell からも実行できます。 タスクが次のとおりであるコードをすぐに提供します。 捜索中です非アクティブなユーザーについては、45 日間の期間を選択し、ユーザー データを無効にして、特別に指定された OU に移動しました。

$date_with_offset= (日付の取得).AddDays(-45)
$users = Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | 最終ログオン日の並べ替え
foreach ($user in $users) (set-aduser $user -enabled $false; move-adobject -identity $user -targetpath "ou=Fired,ou=Moscow L. users,ou=Location,dc=msk,dc= contoso、dc=com")
Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) | Get-ADUser -Properties LastLogonDate -Filter (LastLogonDate -lt $date_with_offset ) 最終ログオン日 | 並べ替え FT 名、LastLogonDate -AutoSize | 出力ファイル c:\Script\users.txt

  • 最初の行では、検索語を設定する変数を宣言します。
  • 変数を作成し、最終ログイン時刻に基づいて選択します
  • ユーザーの移動

  • ファイルへのレポートの作成

ユーザーとの連携に関するその他の便利な機能。 以下のコマンドを使用する前に、コマンドを使用して Active Directory モジュールをロードする必要があります。

Get-Help Get-ADUser

今日は、すべてのユーザーのリストをアップロードしてみます。 別ファイル Active Directoryから。 この問題における主なアシスタントは PowerShell です。 問題は、マイクロソフトが当初計画していたということです コマンドコンソールサーバー管理の主要ツールとしての PowerShell Windows コンポーネント。 そして、すでにバージョン 2.0 が存在する今日、概して、これは当てはまります。

最近でも、管理者は何らかの方法で AD と対話するために、dsquery ユーティリティまたはさまざまな種類のスクリプトやユーティリティを自由に使用できる必要がありました。 今日から Windowsのバージョン Server 2008 R2 では、PowerShell 経由で AD を操作できます。 PowerShell 2.0 の出現により、Active Directory と対話するために特別なモジュールが使用されます。 Active Directory モジュール Windows PowerShell 、 を含む 必要なリストコマンドレット。 タスクには次のコマンドを使用します Get-ADUser.

したがって、どちらが制御されているかに応じて、 オペレーティング·システム PowerShell コンソールを起動するには、「準備手順」を実行する必要があります。

1) Windows Server で作業している場合 バージョン2012まで次に、次のコマンドを実行する必要があります。

  • インポートモジュールのアクティブディレクトリ – モジュールを AD にインポートするコマンド

2012 以降のオペレーティング システム バージョンでは、このモジュールはデフォルトですでに有効になっています。

2) クライアント Windows から作業する場合は、Active Directory モジュール コンポーネントがインストールされた状態で、RSAT リモート管理パッケージをクライアント Windows にインストールする必要があります。 Windows用パワーシェル。

アップロードされるデータの量が最大 1000 ユーザーの場合は、Get-ADUser コマンドレットを実行することをお勧めします。

PowerShell を使用して AD ユーザーを別のファイルにエクスポートする

まず、Get-ADUser コマンドのヘルプを呼び出してみましょう。 その結果、さらなる管理に必要なコマンドをすべて受け取ることができます。

  • ヘルプ Get-ADUser – ヘルプを呼び出すコマンド

PowerShell ウィンドウですべてのプロパティを持つすべてのユーザーのリストを取得するには、次のコマンドを実行する必要があります。

  • Get-ADUser -filter * – AD ユーザーのリストをエクスポートする

このダウンロードは完全に情報を提供するものではなく、ウィンドウにすべてが収まるわけではありません。 必要な情報。 したがって、検索を絞り込んで、user1 という名前の特定のユーザーのプロパティを表示してみましょう。

  • Get-ADUser -identity user1 -properties * – 特定のユーザーのプロパティをエクスポートする

次に、すべてのユーザーのリストとそのプロパティを外部にエクスポートしてみます。 txtまたはcsvファイル:

  • Get-ADUser -filter * -properties * | Export-csv -path c:\users.csv -encoding Unicode – ユーザーを別のファイルにエクスポートする

キーには特に注意したい -Unicode のエンコード。 これは、AD からエクスポートした後、アップロードされたファイルでロシア語のキリル文字が正しく表示されるようにするために役立ちます。 たとえば、 マイクロソフトエクセルロシア語の文字の代わりに疑問符が表示されます。

ファイルを表示すると、データは 1 行でエクスポートされるため、読み取ることができません。 これを変更するには、次のことを行う必要があります。

PowerShell を使用して AD を管理することに特化しています。 出発点として、著者は 10 の一般的な AD 管理タスクを取り上げ、PowerShell を使用してそれらを簡素化する方法を検討することにしました。

  1. ユーザーパスワードをリセットする
  2. アカウントのアクティブ化と非アクティブ化
  3. ユーザーアカウントのロックを解除する
  4. アカウントを削除する
  5. 空のグループを探す
  6. ユーザーをグループに追加する
  7. グループメンバーのリストを表示する
  8. 古いコンピュータアカウントを見つける
  9. コンピュータアカウントを非アクティブ化する
  10. タイプ別にコンピュータを検索する

さらに、著者はブログを管理しています (もちろん PowerShell を使用しています)。jdhitsolutions.com/blog を参照することをお勧めします。 最新情報はTwitterから入手できます twitter.com/ジェフヒックス.
ということで、以下は「Top 10 Active Directory Tasks Solved with PowerShell」という記事の翻訳です。

Active Directory (AD) 管理 Windowsを使用する PowerShell はあなたが思っているよりも簡単です。それを証明したいと思います。 以下のスクリプトを取得して使用するだけで、さまざまな AD 管理タスクを解決できます。

要件

PowerShell を使用して AD を管理するには、いくつかの要件を満たす必要があります。 Windows 7 コンピューターを例として、AD コマンドレットがどのように機能するかを説明します。
コマンドレットを使用するには、Windows Server 2008 R2 ドメイン コントローラーが必要です。または、従来の DC に Active Directory 管理ゲートウェイ サービスをダウンロードしてインストールできます。 インストールする前にドキュメントをよくお読みください。 CD の再起動が必要です。
クライアント側で、Windows 7 または Windows 8 用の (RSAT) をダウンロードしてインストールします。 Windows 7 では、次の場所で開く必要があります。 コントロールパネル ( コントロールパネル) プログラムそして選択してください オンまたはオフにする Windowsの機能(Windowsの機能をオンまたはオフにします)。 探す リモートサーバー管理ツールセクションを展開します 役割管理ツール。 AD DS および AD LDS ツールに適切な項目を選択します。特に、項目を選択する必要があることに注意してください。 Windows PowerShell 用 Active Directory モジュール図 1 に示すように、(Windows 8 では、すべてのツールがデフォルトで選択されています)。 これで作業の準備が整いました。

図 1 AD DS および AD LDS ツールの有効化

ドメイン管理者権限を持つアカウントでログインしています。 ここで紹介するコマンドレットのほとんどでは、代替資格情報を指定できます。 いずれにせよ、ヘルプを読むことをお勧めします ( 助けを得ます) とその例を以下に示します。
PowerShell セッションを開始し、モジュールをインポートします。

PS C:\> インポートモジュール ActiveDirectory

インポートにより新しい PSDrive が作成されますが、それは使用しません。 ただし、インポートされたモジュールで使用可能なコマンドを確認できます。

PS C:\> get-command -module ActiveDirectory

これらのコマンドの利点は、1 つの AD オブジェクトでコマンドを使用できる場合、そのコマンドを 10、100、さらには 1000 の AD オブジェクトでも使用できることです。これらのコマンドレットのいくつかがどのように機能するかを見てみましょう。

タスク 1: ユーザーのパスワードをリセットする

ユーザーのパスワードをリセットするという一般的なタスクから始めましょう。 これはコマンドレットを使用して簡単に行うことができます ADAccountPassword の設定。 やっかいな部分は、 新しいパスワード保護された文字列、つまり PowerShell セッション中に暗号化されてメモリに保存されるテキストとして修飾する必要があります。 まず、新しいパスワードを使用して変数を作成しましょう。
PS C:\> $new=Read-Host "新しいパスワードを入力してください" -AsSecureString

次に、新しいパスワードを入力します。

これで、アカウントを抽出できるようになりました(次を使用) サムアカウント名– 最良のオプション)、新しいパスワードを設定します。 ユーザー Jack Frost の例を次に示します。

PS C:\> Set-ADAccountPassword jfrost -NewPassword $new

残念ながら、このコマンドレットにはバグがあります。 -パススルー, -もしも、 そして -確認する動作しません。 ショートカットを使用したい場合は、これを試してください。

PS C:\> Set-ADAccountPassword jfrost -NewPassword (ConvertTo-SecureString -AsPlainText -String "P@ssw0rd1z3" -force)

その結果、ジャックが次回ログインするときにパスワードを変更する必要があるため、次を使用してアカウントを変更します。 Set-ADUser.

PS C:\> Set-ADUser jfrost -ChangePasswordAtLogon $True

コマンドレットの実行結果はコンソールに書き込まれません。 これを行う必要がある場合は、次を使用します -真実。 ただし、コマンドレットを使用してユーザー名を取得することで、操作が成功したかどうかを確認できます。 Get-ADUserそしてプロパティを指定する パスワードの期限が切れました、図2に示すように。


米。 2. PasswordExpired プロパティを指定した Get-ADUser コマンドレットの結果

結論: ユーザーパスワードを次からリセットします PowerShell を使用するまったく難しくありません。 パスワードのリセットもスナップで簡単にできることは認めます Active Directory ユーザーとコンピュータコンソール Microsoft 管理コンソール (MMC)。しかし PowerShell を使用するタスクを委任する必要がある場合、上記のスナップインを展開したくない場合、または大規模な自動化された IT プロセスの一部としてパスワードをリセットしている場合に適しています。

タスク 2: アカウントをアクティブ化および非アクティブ化する

それでは、アカウントを無効にしてみましょう。 ジャックフロストと協力し続けましょう。 このコードではパラメータを使用します -もしもこれは、コマンドを実行せずにテストするために変更を加える他のコマンドレットで見つけることができます。

PS C:\> Disable-ADAccount jfrost -whatif 状況: ターゲット「CN=Jack Frost、OU=staff、OU=Testing、DC=GLOBOMANTICS、DC=local」に対して操作「Set」を実行しています。

では、実際に無効にしてみましょう。

PS C:\> ADAAccount jfrost を無効にする

そして、アカウントをアクティブ化するときが来たら、どのコマンドレットが役立つでしょうか?

PS C:\>Enable-ADAAccount jfrost

これらのコマンドレットはパイプライン式で使用できるため、必要なだけアカウントをアクティブ化または非アクティブ化できます。 たとえば、このコードは営業部門のすべてのアカウントを非アクティブ化します。

PS C:\> get-aduser -filter "Department -eq "sales"" | アカウントを無効にする

もちろん、次のフィルターを作成します Get-ADUserかなり複雑ですが、ここでパラメータを使用します。 -もしもコマンドレットと一緒に ADアカウントを無効にする助けに来ます。

タスク 3: ユーザー アカウントのロックを解除する

ジャックが新しいパスワードを入力しようとしてアカウントをロックアウトした状況を考えてみましょう。 GUI を使用してアカウントを検索する代わりに、簡単なコマンドを使用してロック解除手順を実行できます。

PS C:\> ADAAccount のロックを解除する jfrost

コマンドレットはパラメーターもサポートしています -もしもそして -確認する.

タスク 4: アカウントを削除する

削除するユーザーの数は関係ありません。コマンドレットを使用すると簡単に削除できます。 削除-ADUser。 Jack Frost を削除したくはありませんが、削除したい場合は、次のようなコードを使用します。

PS C:\> Remove-ADUser jfrost -whatif 状況: ターゲット "CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local" で操作 "削除" を実行しています。

または、複数のユーザーを入力し、1 つの簡単なコマンドで削除することもできます。

PS C:\> get-aduser -filter "enabled -eq "false"" -property WhenChanged -SearchBase "OU=Employees, DC=Globomantics,DC=Local" | ここで ($_.WhenChanged -le (Get-Date).AddDays(-180)) | 削除-ADuser -whatif

このコマンドは、180 日以上変更されていない無効な従業員 OU アカウントをすべて検索して削除します。

タスク 5: 空のグループを見つける

グループの管理は終わりのない、報われない仕事です。 空のグループを見つける方法はたくさんあります。 組織によっては、一部の式が他の式よりもうまく機能する場合があります。 以下のコードは、組み込みグループを含むドメイン内のすべてのグループを検索します。

PS C:\> get-adgroup -filter * | ここで (-Not ($_ | get-adgroupmember)) | 名前を選択してください

数百のメンバーがいるグループがある場合、このコマンドの使用には時間がかかることがあります。 Get-ADGroupMember各グループをチェックします。 制限やカスタマイズができればもっと良いでしょう。
別のアプローチは次のとおりです。

PS C:\> get-adgroup -filter "members -notlike "*" -AND GroupScope -eq "Universal"" -SearchBase "OU=Groups,OU=Employees,DC=Globomantics, DC=local" | 名前、グループを選択*

このコマンドは、OU グループのメンバーシップを持たないすべてのユニバーサル グループを検索し、いくつかのプロパティを表示します。 結果を図 3 に示します。


米。 3. ユニバーサル グループの検索とフィルタリング

タスク 6: ユーザーをグループに追加する

Jack Frost をシカゴの IT グループに追加しましょう。

PS C:\> add-adgroupmember "chicago IT" -メンバー jfrost

はい、とても簡単です。 数百人のユーザーをグループに簡単に追加することもできますが、これは少し面倒だと思います。

PS C:\> Add-ADGroupMember "シカゴ従業員" -member (get-aduser -filter "city -eq "シカゴ"")

括弧で囲まれたパイプライン式を使用して、シカゴの City プロパティを持つすべてのユーザーを検索しました。 括弧内のコードが実行され、結果のオブジェクトが –Member パラメーターに渡されます。 各ユーザー オブジェクトは Chicago Employees グループに追加されます。 扱うユーザーが 5 人であろうと 5,000 人であろうと、グループ メンバーシップの更新には数秒しかかかりません。 この式は次を使用して書くこともできます。 ForEach-Objectもっと便利なものは何か:

PS C:\> Get-ADUser -filter "city -eq "シカゴ"" | foreach (ADGroupMember "シカゴ従業員" - メンバー $_)

タスク 7: グループ メンバーをリストする

誰が入っているのか知りたいかもしれません あるグループ。 たとえば、Domain Admins グループのメンバーを定期的に確認する必要があります。

PS C:\> Get-ADGroupMember "ドメイン管理者"

図 4 に結果を示します。


米。 4. Domain Admins グループのメンバー

このコマンドレットは、各グループ メンバーの AD オブジェクトを表示します。 ネストされたグループはどうすればよいでしょうか? 私のグループ Chicago All Users は、ネストされたグループのコレクションです。 すべてのアカウントのリストを取得するには、パラメータを使用するだけです –再帰的.

PS C:\> Get-ADGroupMember "シカゴのすべてのユーザー" -Recursive | 識別名の選択

別の方法に進みたい場合、つまりユーザーが所属しているグループを確認するには、ユーザー プロパティを使用します。 メンバーの:

PS C:\> get-aduser jfrost -property Memberof | -ExpandProperty memberOf CN=NewTest,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Test,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago IT,OU= を選択します。グループ、OU=従業員、DC=GLOBOMANTICS、DC=ローカル CN=シカゴセールスユーザー、OU=グループ、OU=従業員、DC=GLOBOMANTICS、DC=ローカル

パラメータを使用しました -ExpandProperty名前を表示するには メンバーの線のように。

タスク 8: 古いコンピュータ アカウントを見つける

「古いコンピュータ アカウントを見つけるにはどうすればよいですか?」という質問をよく受けます。 そして私はいつもこう答えます。「あなたにとって何が時代遅れですか?」 コンピュータ アカウント (ユーザー アカウントでもかまいません) が廃止され、使用できなくなる時期については、企業によってさまざまな定義があります。 私の場合、パスワードが変更されていないアカウントに注意を払っています 一定期間時間。 私の場合、この期間は 90 日です。この期間中にコンピュータがドメインとともにパスワードを変更しなかった場合、コンピュータはオフラインで古い可能性が高くなります。 使用されるコマンドレット Get-ADComputer:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| 名前、パスワードの最終設定を選択してください

このフィルターはハード値を使用するとうまく機能しますが、このコードは、2012 年 1 月 1 日以降パスワードを変更していないすべてのコンピューター アカウントに対して更新されます。 結果を図 5 に示します。


米。 5. 古いコンピュータアカウントを見つける

もう 1 つのオプション: 少なくとも Windows 2003 ドメインの機能レベルに達していると仮定します。プロパティでフィルターします。 最終ログオンタイムスタンプ。 この値は、1601 年 1 月 1 日からの 100 ナノ秒間隔の数であり、GMT で保存されるため、この値の操作は少し難しくなります。

PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -properties * | select name,lastlogontimestamp, @(Name="LastLogon";Expression=(::FromFileTime ($_.Lastlogontimestamp))),passwordlastset | LastLogonTimeStamp の並べ替え


米。 6. LastLogonTimeStamp 値を使い慣れた形式に変換します。

フィルターを作成するには、日付 (たとえば、2012 年 1 月 1 日) を正しい形式に変換する必要があります。 変換は FileTime で実行されます。

PS C:\> $cutoff=(Get-Date "1/1/2012").ToFileTime() PS C:\> $cutoff 129698676000000000

これで、この変数をフィルターで使用して、 Get-ADComputer:

PS C:\> Get-ADComputer -Filter "(lastlogontimestamp -lt $cutoff) -or (lastlogontimestamp -notlike "*")" -property * | 名前、最終ログオンタイムスタンプ、パスワード最終セットを選択します

上記のコードは、図 5 に示されているものと同じコンピューターを検索します。

タスク9: コンピュータアカウントを非アクティブ化する

おそらく、非アクティブなアカウントや古いアカウントを見つけたら、それらを非アクティブ化したくなるでしょう。 これは非常に簡単です。 ユーザー アカウントの操作に使用したものと同じコマンドレットを使用します。 を使用して明確にすることができます サムアカウント名アカウント。

PS C:\> Disable-ADAccount -Identity "chi-srv01$" -whatif 状況: ターゲット "CN=CHI-SRV01, CN=Computers,DC=GLOBOMANTICS,DC=local" で操作 "Set" を実行しています。

または、パイプライン式を使用します。

PS C:\> get-adcomputer "chi-srv01" | ADアカウントを無効にする

コードを使用して古いアカウントを見つけて、それらをすべて非アクティブ化することもできます。

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| ADアカウントを無効にする

タスク 10: タイプ別にコンピューターを検索する

また、サーバーやワークステーションなどの種類ごとにコンピューター アカウントを見つける方法についてもよく質問されます。 これには、ある程度の創造性が必要です。 AD では、おそらく OS を除いて、サーバーとクライアントを区別するものは何もありません。 コンピューターで Windows Server 2008 を実行している場合は、いくつかの追加手順を実行する必要があります。
まず、オペレーティング システムのリストを取得する必要があります。次に、利用可能なオペレーティング システムによってアカウントをフィルタリングします。

PS C:\> Get-ADComputer -Filter * -Properties オペレーティングシステム | [オペレーティング システム固有] | [オペレーティング システム固有] を選択します。 オペレーティングシステムの並べ替え

結果を図 7 に示します。


米。 7. OSリストの取得

サーバー OS を実行しているすべてのコンピューターを検索したいと考えています。

PS C:\> Get-ADComputer -Filter "OperatingSystem -like "*Server*"" -properties OperatingSystem,OperatingSystem ServicePack | 名前、操作* | を選択します。 フォーマットリスト

結果を図 8 に示します。

他の AD Get コマンドレットと同様に、必要に応じて検索パラメーターをカスタマイズし、要求を特定の OU に制限できます。 ここで示したすべての式は、より大きな PowerShell 式に統合できます。 たとえば、並べ替え、グループ化、フィルターの適用、CSV へのエクスポート、HTML レポートの作成と電子メール送信などをすべて PowerShell から行うことができます。 この場合、スクリプトを 1 つも記述する必要はありません。
これはボーナスです。HTML ファイルに保存されたユーザーのパスワード有効期間レポートです。

PS C:\> Get-ADUser -Filter "Enabled -eq "True" -AND PasswordNeverExpires -eq "False"" -Properties PasswordLastSet,PasswordNeverExpires,PasswordExpired | Select DistinguishedName,Name,pass*,@(Name="PasswordAge"; Expression=((Get-Date)-$_.PasswordLastSet)) |sort PasswordAge -Descending |sort ConvertTo-Html -Title "パスワード有効期間レポート" | Out-File c:\Work\pwage.htm !}

この式は少し怖く見えるかもしれませんが、PowerShell に関する最小限の知識があれば簡単に使用できます。 そして残るのは 最後のヒント: というカスタム プロパティを定義する方法 パスワード年齢。 この値は、今日と PasswordLastSet プロパティの間のギャップを表します。 次に、新しいプロパティの結果を並べ替えます。 図 9 は、私の小さなテスト ドメインの出力を示しています。

更新:
投稿にはポータルの記事の翻訳が含まれています