バッチファイルでWindowsユーザアカウントを作成する時、「net user %USERNAME% %パスワード文字列%/add」とするのですが、これが上手くいかないことがあったので、自分用に備忘しておきます。
net userコマンドでユーザ作成
Windowsのユーザ作成をコマンドで実行できるのがnet userコマンド。
net user %USRID% "%PASSWD%" /add
で新規ユーザ追加ができますし、/addを除けばパスワード変更もできます。たくさんの処理が必要な時はGUIより便利です。パスワードの打ち間違いは即サインイン締め出しに繋がってしまいますので、打ち間違いがないと言う点が魅力。
バッチファイル化
これをバッチファイルで変数にして、ユーザ別に用意して使っています。(※バッチファイルはテスト用の仮です。実際はもっとオプションを盛り込んでいますが、ここではざっくりと。)
--------------------------------------------------------------
@echo off
set ACCOUTID=TestUser
set USERPW=Hoge@22#Pwd
net user %ACCOUTID% "%USERPW%" /add
net user %ACCOUTID%
pause
set ACCOUTID=
set USERPW=
--------------------------------------------------------------
たとえば、このようなバッチファイルを用意してユーザを追加していたとします。パスワードは大文字・小文字・数字・記号を織り交ぜた10文字以上を用意。
このパスワードを「Hoge@22#Pwd」から「Hoge@22&Pwd」に変更したときに起きました。
実行すると、
このように、
「'Pwd' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
とエラーメッセージが表示されます。
正常完了のときは、
このように、「コマンドは正常に完了しました。」とだけ表示されます。
ログインの確認をしてみたところ、バッチ内で指定した文字列「Hoge@22&Pwd」のうち「「Hoge@22」までしか認識していないようでした。(※runasコマンドで確認)
バッチファイル内で指定しているパスワード文字列のうち、「&」以降の文字列が認識しないようでした。
確認その1:変数を使わずやってみる
問題を確認するため、変数を使わない方法でやってみることにしました。同じ「&」を使ったパスワード文字列を使って、変数を使わずにそのままコマンドを羅列してみるパターンでやってみます。
--------------------------------------------------------------
@echo off
net user TestUser "Hoge@22&Pwd" /add
net user TestUser
pause
--------------------------------------------------------------
この方法だと、前述のようなエラーは出ずに、ユーザの作成が正常終了し、認証(runasコマンドで確認)も「Hoge@22&Pwd」を入力することで認証できました。
と、いうことは、変数に文字列を入れてnet userコマンドで参照すると、特定の記号ではエラーになってしまう、ということじゃないかと考えました。
確認その2:記号別に調べてみる
前述の、パスワードを変数に格納して実行するバッチファイルを使って、エラーの出た「&」以外にも同様のエラーが出るとか、パスワードが(エラーがなくても)正常に認識しないケースがないか調べてみました。
前述のように、「&」の部分を別の記号に変えてユーザ作成し、runasコマンドで確認を各記号でやってみることにしました。
■エラーにならない文字
以下の文字列はエラーにならず、正常にパスワード文字列内の記号として使えました。
! @ # $ * ( ) - _ = + ~ ' ` ; : , . / ? \ ] { }
認識はするけど、アスタリスク(*)のようにコマンド内で特殊な意味を持つ記号は避けたほうが無難なのかもしれません。
■エラーになったり、エラーが出なくても正常に認識しなかった文字
以下の文字は「&」同様にエラーとなってしまったり、エラーが出なくてもパスワードがエラーとなってしまいました。
% ^ & " < > | [
ダブルコーテーション(")などはコマンド内で囲み文字として使うので、正常動作しない、ということですが、その他にも上記の記号は狙った通りにパスワード内の記号として認識してくれないようでした。特に、角カッコ([)は開く括弧が認識しないのに、閉じる括弧(])は認識したという不思議な結果になりました。使わない方が無難なのかもしれません。
Windowsユーザ作成時に気にしておく
ここまでの確認で、バッチファイル内で変数を使う環境でのnet userコマンドに使用可能な文字列とエラー(エラーの要因)となる文字列があることを学びました。
非常に限られた環境での知識ではありますが、未来の自分のために覚えておこうと思います。