kakakakakku blog

Weekly Tech Blog: Keep on Learning!

WMIスクリプトで「パスワードを無期限にする」を操作する

"wmic useraccount"でsetできず

DOSの"net user"コマンドでアカウント設定の操作ができるが,「パスワードを無期限にする」設定を操作することができない.マイクロソフトの実装上の漏れなのか,セキュリティ上の問題で意図的に制限しているのかは定かではないが,なんとなく後者のような気がする.

ということで,Archive Sawanoblog 1stを参照してWMIスクリプトを使ってみようと思ったが,Windows Server 2003, Windows Server 2008の両環境でプロパティの更新時にエラーが発生してしまってどうにもならなくなった.エラーコードでも調べてみたけど解決の糸口が見つからず今回は断念.ちなみにgetコマンドは正常に動作しているので,更新時のみに顕在化するエラーの模様.

>wmic useraccount where Name="Kakku22" set PasswordExpires=False
エラー:
コード = 0x80041001
説明 = エラーです
機能 = WMI

>wmic useraccount get Name,PasswordExpires
Name PasswordExpires
Administrator False
Guest False
Kakku22 False

vbsを代替案として採用

そんな中,vbsで同等の操作ができるということで,試してみたところ正常終了したので今回はこの方法を採用することに決定.

401 Authorization Required
WSHで「パスワードを無期限にする」にチェックを入れる。 - 関打エアコン

複数ユーザに対応するようにコードを少し修正

今回は多くのユーザを対象に一括設定を行いたかったので,アカウント設定の機能を関数化してアカウント名を引数で呼び出す形にカスタマイズした.setPasswordExpiresFalse("UserName")のところはExcelの文字列連結でアカウント一覧から簡単に作成できる.

Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000
Const TargetHostname = "127.0.0.1"

setPasswordExpiresFalse("Administrator")
setPasswordExpiresFalse("Kakku22")

MsgBox "Finish!"

Sub setPasswordExpiresFalse(TargetUsername)
 Set objuser = GetObject("WinNT://" & TargetHostname & "/" & TargetUsername)
 objflag = objuser.UserFlags Or ADS_UF_DONT_EXPIRE_PASSWD
 objuser.Put "userFlags", objflag
 objuser.SetInfo
End Sub