SEブログ

【Active Directory】PowerShellでオブジェクト一覧を取得する

こんにちは!

 

 

 

今回は、Active Directory でオブジェクトをまとめて取得する方法やファイルにエクスポートする方法について書いてみました。

 

 

以前、システム管理の仕事をしていた時に、社内のコンピューターアカウントや、ユーザーアカウントの一覧を出してほしいとか依頼が定期・不定期に受けていました。

さすがに画面を見て、一個一個手入力する事は、アカウントの数が多いと時間がかかってしまいますよね。

 

 

確かにユーザー名やコンピューター名のみであれば、Active Directory ユーザーとコンピューターからCSV 形式でエクスポートできます。

しかし、Active Directory のオブジェクトを必要な属性のみ取得して一覧表示したい場合や、またファイルにエクスポートしたい場合、 Active Directory ユーザーとコンピューター からはできませんが、PowerShell にはそれができます。

 

 

個人的な観点ですが、視認性を向上する為にコマンドレットの内容が長いものは、シングルクォーテーションで区切って複数行にして書いています。

 

 

コンピューターアカウント

 

 

Get-ADComputer コマンドレットを使い、Active Directory のユーザーを参照する事ができます。

 

 

一覧をコンソールに出力する

 

 

以下のコマンドは、全てのコンピューターアカウントのプロパティをフィルタして取得しています。

それからパイプラインを使って Format-Table で指定した属性(例えばコンピューターアカウント名や OS の名前など)をテーブルに自動で整形して出力します。

 

 

Get-ADComputer `
 -Filter * `
 -Property * | `
Format-Table `
 Name, `
 OperatingSystem, `
 OperatingSystemServicePack, `
 OperatingSystemVersion `
 -Wrap –Auto


# 実行結果

Name OperatingSystem OperatingSystemServicePack OperatingSystemVersion
---- --------------- -------------------------- ----------------------
DEVDC01 Windows Server 2016 Standard Evaluation 10.0 (14393) 
DEVDC02 Windows Server 2016 Standard Evaluation 10.0 (14393) 

 

 

上の内容を少し変えてみたいので、全てフィルタするのではなく、-Like を使って特定の名前を検索してみます。

 

-Like はワイルドカードを使って検索するのですが、半角のアスタリスク * を使います。

 

Get-ADComputer `
 -Filter {OperatingSystem -Like *Windows Server*} `
 -Property * | `
Format-Table `
 Name, `
 OperatingSystem, `
 OperatingSystemServicePack `
 -Wrap -Auto


# 実行結果

Name OperatingSystem OperatingSystemVersion
---- --------------- ----------------------
DEVDC01 Windows Server 2016 Standard Evaluation 10.0 (14393) 
DEVDC02 Windows Server 2016 Standard Evaluation 10.0 (14393) 

 

 

今度は、-Like を使って「オペレーティングシステムのバージョンが 10 より大きい」という条件で検索してみます。

 

Get-ADComputer `
 -Filter {OperatingSystemVersion -ge 10} `
 -Property * | `
Format-Table `
 Name, `
 OperatingSystem, `
 OperatingSystemVersion `
 -Wrap -Auto


# 実行結果

Name OperatingSystem OperatingSystemVersion
---- --------------- ----------------------
DEVDC01 Windows Server 2016 Standard Evaluation 10.0 (14393) 
DEVDC02 Windows Server 2016 Standard Evaluation 10.0 (14393) 

 

 

出力した内容を CSV 形式でファイルにしてエクスポートする

 

 

出力した内容が多い場合や、データとして保存・加工したい場合はファイルにエクスポートする事ができます。

 

Export-CSV コマンドレットは、出力したデータをコンマ区切りでエクスポートします。

 

NoTypeInformation は出力後のファイルを開いた時に、一番上に表示される情報になります。私は不要なので -NoTypeInformation を付けています。

Encoding UTF-8 は文字化け対策になります。

 

$file_path = "c:\temp\server.csv";
Get-ADComputer `
 -Filter * `
 -Property * | `
Select-Object `
 Name, `
 OperatingSystem, `
 OperatingSystemServicePack, `
 OperatingSystemVersion | `
Export-CSV `
 $file_path `
 -NoTypeInformation `
 -Encoding UTF8

 

 

実行結果は以下のようになります。

 

 

ユーザーアカウント

 

 

Get-ADUser コマンドレットを使い、Active Directory のユーザーを参照する事ができます。

 

 

一覧をコンソールに出力する

 

 

以下のコマンドは、全てのユーザーアカウントを取得し、ユーザー、パスワードを変更した日とパスワードの期限が切れる日を取得しています。

それからパイプラインを使って Format-Table で指定した属性(上記で取得したもの)をテーブルに自動で整形して出力します。

 

Get-ADUser `
 -Filter * `
 -Properties `
  Passwordlastset, `
  Passwordneverexpires | `
Format-Table `
 Name, `
 Passwordlastset, `
 Passwordneverexpires `
 -Wrap -Auto


# 実行結果

Name Passwordlastset Passwordneverexpires
---- --------------- --------------------
Administrator 2018/05/03 14:10:05 True
Guest True
DefaultAccount True
krbtgt 2018/05/04 15:48:36 False
Urashima Taro 2018/05/11 19:16:43 True
User 1 2018/05/28 16:38:42 False
User 2 2018/05/28 16:39:06 False
User 3 2018/05/28 16:39:30 False

 

 

また、パスワードの有効期限が切れる日を出力したい場合、-Properties で msDS-UserPasswordExpiryTimeComputed スキーマ属性を使います。

 

 

Get-ADuser `
 user1 `
 -Properties `
  msDS-UserPasswordExpiryTimeComputed | `
Select `
 Name, `
 msDS-UserPasswordExpiryTimeComputed


# 実行結果

Name msDS-UserPasswordExpiryTimeComputed
---- -----------------------------------
User 1 131755955224052433

 

 

パスワードの有効期限が切れる日が、日付のフォーマットではなく、長い桁の数字で返ってきました。

msDS-UserPasswordExpiryTimeComputed はタイムスタンプ属性で、返り値は 整数型のようです。

ですのでこれを日付型に変換してあげる必要があります。

 

以下のサイトを参考にさせて頂きました。(リンクが別ウィンドウで開きます。)

https://www.morgantechspace.com/2015/03/powershell-get-ad-users-password-expiry-date.html#export | Morgan Tech Space

 

Get-ADUser `
user1 `
 –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" | `
Select-Object `
 -Property "Name", `
@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}


# 実行結果

Name ExpiryDate 
---- ---------- 
User 1 2018/07/09 16:38:42

 

 

ちゃんと日付型で返ってきました。

今度は PasswordNeverExpires のステータスが無効になっているユーザーアカウントを出力してみます。

 

 

Get-ADUser `
 -Filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} `
 –Properties "Name", "msDS-UserPasswordExpiryTimeComputed" | `
Select-Object `
 -Property "Name", `
 @{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}


# 実行結果

Displayname ExpiryDate 
----------- ---------- 
User 1 2018/07/09 16:38:42
User 2 2018/07/09 16:39:06
User 3 2018/07/09 16:39:30

 

 

PasswordNeverExpires のステータスが無効になっているユーザーの一覧が取得できました。

では最後に、これを CSV フォーマットでファイルに出力してみます。

 

 

出力した内容を CSV 形式でファイルにしてエクスポートする

 

 

出力した内容が多い場合や、データとして保存・加工したい場合はファイルにエクスポートする事ができます。

 

Export-CSV コマンドレットは、出力したデータをコンマ区切りでエクスポートします。

 

NoTypeInformation は出力後のファイルを開いた時に、一番上に表示される情報になります。私は不要なので -NoTypeInformation を付けています。

Encoding UTF-8 は文字化け対策になります。

 

 

$file_path = "c:\temp\userpassword.csv";
Get-ADUser `
-Filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} `
 –Properties "Name", "msDS-UserPasswordExpiryTimeComputed" | `
Select-Object `
 -Property "Name", `
@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}} | `
Export-CSV `
-Path $file_path `
-NoTypeInformation `
-Encoding UTF8

 

 

実行結果は以下のようになります。

 

 

いかがでしょうか。

 

 

PowerShell でこのような事ができますと便利ですよね。

上司から「パスワードの有効期限が無期限になっているユーザーがいるか確認してもらえるかな」と言われても、Active Directory ユーザーとコンピューターでアカウント毎に確認しなくても、PowerShell で迅速に対応ができます。

 

では最後までお読みいただきありがとうございました!

 

 

おすすめの本はこちら ↓↓↓