Windows:ユーザー一覧をコマンドで取得

Windows

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」のためこの画面さえ開けない・・・

目指すのはユーザが一覧として表示され、各ユーザに対して下記の項目が取得できること。

  1. ユーザーは次回ログオン時にパスワードの変更が必要
  2. ユーザーはパスワードを変更できない
  3. パスワードを無期限にする
  4. アカウントを無効にする
  5. アカウントのロックアウト

“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ででてこないものも大量にでてきたので、上記のようなスクリプトになりました。

広告

コメント

タイトルとURLをコピーしました