はじめに
今回やりたかったことは
Windows Server 2016のローカルユーザー一覧を出力し状態を確認すること
です。
状態というのは、
この画面のオプション設定のことです。
使う関数
まずは今回の利用するPowerShellの関数はGet-WmiObjectです。
早速ですがGet-WmiObject関数を使ってユーザー情報を取得するには以下を実行してください。
Get-WmiObject Win32_UserAccount | ? { $_.LocalAccount -eq $true }
こちらの実行結果は
AccountType : 512
Caption : TEST\Administrator
Domain : TEST
SID : S-1-5-21-252517646-722763419-582487689-500
FullName :
Name : Administrator
AccountType : 512
Caption : TEST\bbbb
Domain : TEST
SID : S-1-5-21-252517646-722763419-582487689-1005
FullName : bbbb
Name : bbbb
AccountType : 512
Caption : TEST\cccc
Domain : TEST
SID : S-1-5-21-252517646-722763419-582487689-1006
FullName : cccc
Name : cccc
AccountType : 512
Caption : TEST\DefaultAccount
Domain : TEST
SID : S-1-5-21-252517646-722763419-582487689-503
FullName :
Name : DefaultAccount
AccountType : 512
Caption : TEST\Guest
Domain : TEST
SID : S-1-5-21-252517646-722763419-582487689-501
FullName :
Name : Guest
こんな感じです。
詳細情報を表示したい場合は Format-List *を追加して実行します。
Get-WmiObject Win32_UserAccount | ? { $_.LocalAccount -eq $true } | Format-List *
実行結果は、
PSComputerName : TEST
Status : OK
Caption : TEST\Administrator
PasswordExpires : False
__GENUS : 2
__CLASS : Win32_UserAccount
__SUPERCLASS : Win32_Account
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_UserAccount.Domain="TEST",Name="Administrator"
__PROPERTY_COUNT : 16
__DERIVATION : {Win32_Account, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : TEST
__NAMESPACE : root\cimv2
__PATH : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="Administrator"
AccountType : 512
Description : コンピューター/ドメインの管理用 (ビルトイン アカウント)
Disabled : False
Domain : TEST
FullName :
InstallDate :
LocalAccount : True
Lockout : False
Name : Administrator
PasswordChangeable : True
PasswordRequired : True
SID : S-1-5-21-252517646-722763419-582487689-500
SIDType : 1
Scope : System.Management.ManagementScope
Path : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="Administrator"
Options : System.Management.ObjectGetOptions
ClassPath : \\TEST\root\cimv2:Win32_UserAccount
Properties : {AccountType, Caption, Description, Disabled...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers : {dynamic, Locale, provider, UUID}
Site :
Container :
PSComputerName : TEST
Status : OK
Caption : TEST\bbbb
PasswordExpires : True
__GENUS : 2
__CLASS : Win32_UserAccount
__SUPERCLASS : Win32_Account
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_UserAccount.Domain="TEST",Name="bbbb"
__PROPERTY_COUNT : 16
__DERIVATION : {Win32_Account, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : TEST
__NAMESPACE : root\cimv2
__PATH : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="bbbb"
AccountType : 512
Description :
Disabled : False
Domain : TEST
FullName : bbbb
InstallDate :
LocalAccount : True
Lockout : False
Name : bbbb
PasswordChangeable : True
PasswordRequired : True
SID : S-1-5-21-252517646-722763419-582487689-1005
SIDType : 1
Scope : System.Management.ManagementScope
Path : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="bbbb"
Options : System.Management.ObjectGetOptions
ClassPath : \\TEST\root\cimv2:Win32_UserAccount
Properties : {AccountType, Caption, Description, Disabled...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers : {dynamic, Locale, provider, UUID}
Site :
Container :
PSComputerName : TEST
Status : OK
Caption : TEST\cccc
PasswordExpires : True
__GENUS : 2
__CLASS : Win32_UserAccount
__SUPERCLASS : Win32_Account
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_UserAccount.Domain="TEST",Name="cccc"
__PROPERTY_COUNT : 16
__DERIVATION : {Win32_Account, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : TEST
__NAMESPACE : root\cimv2
__PATH : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="cccc"
AccountType : 512
Description :
Disabled : False
Domain : TEST
FullName : cccc
InstallDate :
LocalAccount : True
Lockout : False
Name : cccc
PasswordChangeable : True
PasswordRequired : True
SID : S-1-5-21-252517646-722763419-582487689-1006
SIDType : 1
Scope : System.Management.ManagementScope
Path : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="cccc"
Options : System.Management.ObjectGetOptions
ClassPath : \\TEST\root\cimv2:Win32_UserAccount
Properties : {AccountType, Caption, Description, Disabled...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers : {dynamic, Locale, provider, UUID}
Site :
Container :
PSComputerName : TEST
Status : Degraded
Caption : TEST\DefaultAccount
PasswordExpires : False
__GENUS : 2
__CLASS : Win32_UserAccount
__SUPERCLASS : Win32_Account
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_UserAccount.Domain="TEST",Name="DefaultAccount"
__PROPERTY_COUNT : 16
__DERIVATION : {Win32_Account, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : TEST
__NAMESPACE : root\cimv2
__PATH : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="DefaultAccount"
AccountType : 512
Description : システムで管理されるユーザー アカウントです。
Disabled : True
Domain : TEST
FullName :
InstallDate :
LocalAccount : True
Lockout : False
Name : DefaultAccount
PasswordChangeable : True
PasswordRequired : False
SID : S-1-5-21-252517646-722763419-582487689-503
SIDType : 1
Scope : System.Management.ManagementScope
Path : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="DefaultAccount"
Options : System.Management.ObjectGetOptions
ClassPath : \\TEST\root\cimv2:Win32_UserAccount
Properties : {AccountType, Caption, Description, Disabled...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers : {dynamic, Locale, provider, UUID}
Site :
Container :
PSComputerName : TEST
Status : Degraded
Caption : TEST\Guest
PasswordExpires : False
__GENUS : 2
__CLASS : Win32_UserAccount
__SUPERCLASS : Win32_Account
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_UserAccount.Domain="TEST",Name="Guest"
__PROPERTY_COUNT : 16
__DERIVATION : {Win32_Account, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER : TEST
__NAMESPACE : root\cimv2
__PATH : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="Guest"
AccountType : 512
Description : コンピューター/ドメインへのゲスト アクセス用 (ビルトイン アカウント)
Disabled : True
Domain : TEST
FullName :
InstallDate :
LocalAccount : True
Lockout : False
Name : Guest
PasswordChangeable : False
PasswordRequired : False
SID : S-1-5-21-252517646-722763419-582487689-501
SIDType : 1
Scope : System.Management.ManagementScope
Path : \\TEST\root\cimv2:Win32_UserAccount.Domain="TEST",Name="Guest"
Options : System.Management.ObjectGetOptions
ClassPath : \\TEST\root\cimv2:Win32_UserAccount
Properties : {AccountType, Caption, Description, Disabled...}
SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers : {dynamic, Locale, provider, UUID}
Site :
Container :
こんな感じです。
応用(変数に代入して呼び出そう)
それでは取得した値を変数($u)に格納します。
$u = Get-WmiObject Win32_UserAccount | ? { $_.LocalAccount -eq $true }
例えば$uに格納した値のうち「Name」を見るには
$u.Name
実行結果は、
PS C:\> $u.Name
Administrator
bbbb
cccc
DefaultAccount
Guest
こちらのとおり。しっかり値が取れて格納されてますね!
この中から今回私が必要としていた情報は、
- アカウント名 -> Name
- ユーザーは次回ログオン時にパスワードの変更が必要 -> PasswordRequired
- ユーザーはパスワードを変更できない -> PasswordChangeable
- パスワードを無期限にする -> PasswordExpires
- アカウントを無効にする -> Disabled
- アカウントのロックアウト -> Lockout
です。
結果
ぱっと見結果に問題はないように見えたのですがこの値の中で1つだけ問題がありました。
ユーザーは次回ログオン時にパスワードの変更が必要
これにやられました!
OSが最初から用意している無効な状態のデフォルトアカウントの「DefaultAccount」「Guest」は正しくfalseなのに
新規に作ったユーザーはONだろうがOFFだろうがPasswordRequiredの値にTrueが返ってくるんです。
GUIで見る実際のユーザーの設定は以下の通りなんですが先の結果を見ていただくとPasswordRequiredがTrueなんです。
とりあえずの回避策として
- ユーザーはパスワードを変更できない -> PasswordChangeable
- パスワードを無期限にする -> PasswordExpires
このどちらかまたは両方がONならPasswordRequiredはFalseとして扱うという条件にしました。
メモ
PasswordChangeableはTrueならGUI上ではON
PasswordExpiresはFalseならGUI上ではON
ただこれでも新規ユーザーを作成したときに全てのオプションをOFFにして作成された場合は救えません。
そのことについては不具合・OS仕様ということと全てのオプションをOFFでユーザー作成することも滅多にないだろうって判断で制限事項としてとりあえずOKとしました。
おまけ1
ちなみにですが、ユーザーは次回ログオン時にパスワードの変更が必要 この値はDOSコマンドの「net user アカウント名」では取れない値なんです。
C:\Users\Administrator>net user administrator
ユーザー名 Administrator
フル ネーム
コメント コンピューター/ドメインの管理用 (ビルトイン アカウント)
ユーザーのコメント
国/地域番号 000 (システム既定)
アカウント有効 Yes
アカウントの期限 無期限
最終パスワード変更日時 2018/06/07 11:06:46
パスワード有効期間 無期限
パスワード次回変更可能日時 2018/06/07 11:06:46
パスワードあり Yes
ユーザーによるパスワード変更可能 Yes
ログオン可能なワークステーション すべて
ログオン スクリプト
ユーザー プロファイル
ホーム ディレクトリ
最終ログオン日時 2018/06/07 9:08:46
ログオン可能時間 すべて
所属しているローカル グループ *Administrators
所属しているグローバル グループ *なし
コマンドは正常に終了しました。
おまけ2
wmicでもPowerShell同様の結果でした。
C:\Users\Administrator>wmic USERACCOUNT list full
AccountType=512
Description=コンピューター/ドメインの管理用 (ビルトイン アカウント)
Disabled=FALSE
Domain=TEST
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Administrator
PasswordChangeable=TRUE
PasswordExpires=FALSE
PasswordRequired=TRUE
SID=S-1-5-21-252517646-722763419-582487689-500
SIDType=1
Status=OK
AccountType=512
Description=
Disabled=FALSE
Domain=TEST
FullName=bbbb
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=bbbb
PasswordChangeable=TRUE
PasswordExpires=TRUE
PasswordRequired=TRUE
SID=S-1-5-21-252517646-722763419-582487689-1005
SIDType=1
Status=OK
AccountType=512
Description=
Disabled=FALSE
Domain=TEST
FullName=cccc
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=cccc
PasswordChangeable=TRUE
PasswordExpires=TRUE
PasswordRequired=TRUE
SID=S-1-5-21-252517646-722763419-582487689-1006
SIDType=1
Status=OK
AccountType=512
Description=システムで管理されるユーザー アカウントです。
Disabled=TRUE
Domain=TEST
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=DefaultAccount
PasswordChangeable=TRUE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-252517646-722763419-582487689-503
SIDType=1
Status=Degraded
AccountType=512
Description=コンピューター/ドメインへのゲスト アクセス用 (ビルトイン アカウント)
Disabled=TRUE
Domain=TEST
FullName=
InstallDate=
LocalAccount=TRUE
Lockout=FALSE
Name=Guest
PasswordChangeable=FALSE
PasswordExpires=FALSE
PasswordRequired=FALSE
SID=S-1-5-21-252517646-722763419-582487689-501
SIDType=1
Status=Degraded