ADSIでローカルユーザの「ユーザーは次回ログオン時にパスワードの変更が必要」を取得する

現在、Serverspecを使ってWindows Serverのパラメータをチェックするためのテストコードを作成しています。
その中でタイトルの値をPowershellで取りたかったのですが、簡単に書いてくれてる記事がなかったので残しておきます。

GUIで表示されてる通りの、以下の値が取得できます。

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

ちなみに特定の1ユーザだけで取得したかったので、その前提で書いてます。
複数ユーザで取得する場合は、他の方の記事を参照ください。

目次

Win32_UserAccountオブジェクトからは取得できない

こちらの記事にある通り、Win32_UserAccountのプロパティは、GUIと同じ値は示していません。
比較してみればわかると思います。

ADSIで取得する

ということで、ADSIを使って取得していくわけですが、正直ググってみてもよくわからなくないですか?
私がインフラエンジニアでほとんどコードを書いてこなかったせいもありますが、みんな難しく書きすぎてる気が。。。

ということで、なるべく無駄なものは削って、シンプルに追っていきます。

ADSIにログイン?

ちゃんと調べないまま書いているのですが、ADSIにログイン?みたいなことをします。
こんな感じで。

> [ADSI]("WinNT://ホスト名/ユーザ名")

distinguishedName :
Path              : WinNT://ホスト名/ユーザ名

>

上記のような表示が出ればOKです。

UserFlagsを取得する

UserFlagsというパラメータ?を取得します。

> ([ADSI]("WinNT://ホスト名/ユーザ名")).Get("UserFlags")
66051
>

この数字が出力されれば、値は取れたも同然です。

数字を解析する

取得できた数字を解析します。

> 66051 -band 0x800000
0
>

このbandというのは、論理和を取って?います。
まぁサブネットマスクのようなあれですね。

で、bandの後の数字がチェックする項目を表します。
色んな記事で記載されている一覧を引用および抜粋して、私なりの改修を加えると以下になります。

ADS_UF_ACCOUNTDISABLE = 2, // 0x2
 ⇒アカウントを無効にする

ADS_UF_LOCKOUT = 16, // 0x10
 ⇒アカウントのロックアウト

ADS_UF_PASSWD_CANT_CHANGE = 64, // 0x40
 ⇒ユーザーはパスワードを変更できない

ADS_UF_DONT_EXPIRE_PASSWD = 65536, // 0x10000
 ⇒パスワードを無期限にする

ADS_UF_PASSWORD_EXPIRED = 8388608, // 0x800000
 ⇒ユーザーは次回ログオン時にパスワードの変更が必要

取得できた数値に、チェックしたい項目の数値と論理和を取ることで、値が設定されているかどうかがわかります。
設定されていれば、上記の10進数の値が返ってきます。
設定されていなければ、0が返ってきます。

サンプル結果

例を挙げて説明すると、以下ということです。

以下のようにワンライナーで比較もできますが、毎回取りにいって無駄なので、他の方がやっているようにUserFlagsの数値を変数に入れた方がスマートですね。

「アカウントを無効にする」にチェックあり

> ([ADSI]("WinNT://ホスト名/ユーザ名")).Get("UserFlags") -band 0x2
2

「アカウントのロックアウト」にチェックなし

> $ADSI = [ADSI]("WinNT://ホスト/ユーザ名")
> $ADSI.Get("UserFlags") -band 0x10
0

「ユーザーはパスワードを変更できない」にチェックなし

> $userflags = $ADSI.Get("UserFlags")
> $userflags -band 0x40
0

「パスワードを無期限にする」にチェックあり

> $userflags -band 0x10000
65536

「ユーザーは次回ログオン時にパスワードの変更が必要」にチェックなし

> $userflags -band 0x800000
0

ちなみに

他の方の記事でborを使ってますが、これは論理積を取っているので、設定をしている(ビットを立てている)ということですね。
頭の良い人が考えたとしか思えないスマートさですね。。。

最後に

この設定項目は、ローカルユーザに対して未だにコマンドレットで取れないと思うので、また使う機会がありそうです。

でもドメインユーザは普通に取れたような?
そもそもADSIって、Active Directory Services Interfacesなんですよね??

それでは。

  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次