GUIで取得できる「ユーザー」の一覧をコマンドで取得する方法を考えてみます。
結論
先に結論から。実施するためのコードは下記のような感じになった。
$ErrorActionPreference = "silentlycontinue"
Out-File "out.csv"
$UsrAcc = Get-WmiObject Win32_UserAccount
$ADSI = [ADSI]("WinNT://{0}" -f $Env:ComputerName)
Write-Output("ユーザ" + "`t" + "ユーザーは次回ログオン時にパスワードの変更が必要" + "`t" + `
"ユーザーはパスワードを変更できない" + "`t" + "パスワードを無期限にする" + "`t" + `
"アカウントを無効にする" + "`t" + "アカウントのロックアウト") | Tee-Object -Append -FilePath "out.csv"
foreach ($Usr in $UsrAcc){
$name = $Usr.Name
$UserFlags = ($ADSI.Children | Where-Object { $_.SchemaClassName -eq "user" } | `
Where-Object { $_.name -eq $name }).Get("UserFlags")
Switch ($UserFlags -band 0x800000){
0 {$needPWChg = "無効"}
default {$needPWChg = "有効"}
}
Switch ($UserFlags -band 0x40){
0 {$cantPWChg = "無効"}
default {$cantPWChg = "有効"}
}
Switch ($UserFlags -band 0x10000){
0 {$cantPWExp = "無効"}
default {$cantPWExp = "有効"}
}
Switch ($UserFlags -band 0x2){
0 {$Disabled = "有効"}
default {$Disabled = "無効"}
}
Switch ($UserFlags -band 0x10){
0 {$Lockout = "無効"}
default {$Lockout = "有効"}
}
Write-Output($name + "`t" + $needPWChg + "`t" + $cantPWChg + "`t" + $cantPWExp+ "`t" + $Disabled+ "`t" + $Lockout) `
| Tee-Object -Append -FilePath "out.csv"
}
結果からすると思ったよりうまいこといったかなと。
詳細は「”[ADSI](“WinNT://{0}” -f $Env:ComputerName)”コマンド」参照
今回の目的
システムの設計書なんかでOSの設定値として管理するパラメータシート的なものをコマンドで取得したい。
ユーザーのプロパティとしてWindowsがGUIで表示するのは下記の内容。
個人PCは「Windows 10 Home」のためこの画面さえ開けない・・・
目指すのはユーザが一覧として表示され、各ユーザに対して下記の項目が取得できること。
- ユーザーは次回ログオン時にパスワードの変更が必要
- ユーザーはパスワードを変更できない
- パスワードを無期限にする
- アカウントを無効にする
- アカウントのロックアウト
“net user”コマンド
コマンドプロンプトにて「net user」を実行
\DESKTOP-XXXXXX のユーザー アカウント
————————————————
Administrator DefaultAccount Guest
user01 WDAGUtilityAccount
コマンドは正常に終了しました。
本当に一覧だけ。net user の後にユーザ名をつけると詳細がでてくるが、コマンドプロンプトでループ処理は面倒なのでここまで。
”Get-WmiObject Win32_UserAccount”コマンド
Powershellで「Get-WmiObject Win32_UserAccount」を実施
AccountType : 512
Caption : DESKTOP-XXXXXX\Administrator
Domain : DESKTOP-XXXXXX
SID : S-1-5-21-1604393204-3010353399-789030502-500
FullName :
Name : Administrator
複数情報があるようでほぼ情報がない・・・。Format-ListつけてもかわらないからSIDで紐づけてほかのコマンドかレジストリからかと思ったが・・・
「Get-WmiObject Win32_UserAccount | get-member」コマンドで見ると、割とあった。
(なんで隠すのか・・・。もっと探しやすくしてよ。)
ユーザーのプロパティ項目とコマンドの値の対応表
No | ユーザープロパティ項目 | Win32_UserAccount プロパティ値 |
1 | ユーザーは次回ログオン時にパスワードの変更が必要 | ? |
2 | ユーザーはパスワードを変更できない | PasswordChangeable Property bool PasswordChangeable {get;set;} |
3 | パスワードを無期限にする | PasswordExpires Property bool PasswordExpires {get;set;} |
4 | アカウントを無効にする | Disabled Property bool Disabled {get;set;} |
5 | アカウントのロックアウト | Lockout Property bool Lockout {get;set;} |
なんとかなりそうな雰囲気だが、上の「1」に対応するものがなさそう。レジストリも探さなきゃかなと思ったが検索すると別のコマンドがあったのでそっちを確認する。
”[ADSI](“WinNT://{0}” -f $Env:ComputerName)”コマンド
ADSIは「Active Directory サービスインターフェイス」のことらしい。
この機能初めて知った。
参考リンク
https://takeda-itsvreng.com/?p=237
「UserFlags」の謎の数値がマスクされた値なのかな。これをうまいことビット演算するとユーザプロパティのそれぞれの有効・無効が判定できるということらしい。
これはためになるなぁ
できたスクリプトは下記の通り。
$ErrorActionPreference = "silentlycontinue"
Out-File "out.csv"
$UsrAcc = Get-WmiObject Win32_UserAccount
$ADSI = [ADSI]("WinNT://{0}" -f $Env:ComputerName)
Write-Output("ユーザ" + "`t" + "ユーザーは次回ログオン時にパスワードの変更が必要" + "`t" + `
"ユーザーはパスワードを変更できない" + "`t" + "パスワードを無期限にする" + "`t" + `
"アカウントを無効にする" + "`t" + "アカウントのロックアウト") | Tee-Object -Append -FilePath "out.csv"
foreach ($Usr in $UsrAcc){
$name = $Usr.Name
$UserFlags = ($ADSI.Children | Where-Object { $_.SchemaClassName -eq "user" } | `
Where-Object { $_.name -eq $name }).Get("UserFlags")
Switch ($UserFlags -band 0x800000){
0 {$needPWChg = "無効"}
default {$needPWChg = "有効"}
}
Switch ($UserFlags -band 0x40){
0 {$cantPWChg = "無効"}
default {$cantPWChg = "有効"}
}
Switch ($UserFlags -band 0x10000){
0 {$cantPWExp = "無効"}
default {$cantPWExp = "有効"}
}
Switch ($UserFlags -band 0x2){
0 {$Disabled = "有効"}
default {$Disabled = "無効"}
}
Switch ($UserFlags -band 0x10){
0 {$Lockout = "無効"}
default {$Lockout = "有効"}
}
Write-Output($name + "`t" + $needPWChg + "`t" + $cantPWChg + "`t" + $cantPWExp+ "`t" + $Disabled+ "`t" + $Lockout) `
| Tee-Object -Append -FilePath "out.csv"
}
結果はこんな感じ
ユーザ | ユーザーは次回ログオン時にパスワードの変更が必要 | ユーザーはパスワードを変更できない | パスワードを無期限にする | アカウントを無効にする | アカウントのロックアウト |
Administrator | 無効 | 無効 | 有効 | 無効 | 無効 |
DefaultAccount | 無効 | 無効 | 有効 | 無効 | 無効 |
Guest | 無効 | 有効 | 有効 | 無効 | 無効 |
ちょっと環境がないので検証はできてないけど、おおよそあってそう。
Win32_UserAccountでユーザ名だけとっているけど、いらないのかも。
ADSIのUserはGUIででてこないものも大量にでてきたので、上記のようなスクリプトになりました。
コメント