ローカルセキュリティポリシーの設定変更バッチ
Pocket

以前ローカルセキュリティポリシーの変更コマンド「secedit」について記述していたが、今回はこれをPStools等と組み合わせてリモートから一括でローカルセキュリティポリシーを変更するバッチを作成出来ないか試してみた。

仕組みとしては、

  1. 対象のマシンからローカルセキュリティポリシーのテンプレートファイルをエクスポート
  2. 事前に用意してあるローカルセキュリティポリシーの差分ファイルとマージさせたテンプレートファイルを作成
  3. 作成したテンプレートファイルを対象のマシンにインポート

上記の流れでローカルセキュリティポリシーの変更を行わせるので、別々の設定がされているマシンに対しても同一の変更を行うことが出来る。

差分ファイルのイメージは以下。
●secedit_list.txt

MinimumPasswordAge = 0
MaximumPasswordAge = 365
MinimumPasswordLength = 0

バッチファイルのソースは以下。

Sponsored Links

●set_secedit.bat

@Echo off
Setlocal enabledelayedexpansion
 
 Rem =====================================================
 Set YYYY=%Date:~0,4%
 Set MM=%Date:~5,2%
 Set DD=%Date:~8,2%
 Set YYYYMMDD=%Date:~0,4%%Date:~5,2%%Date:~8,2%
  
 Set HH_=%Time:~0,2%
 Set MM_=%Time:~3,2%
 Set SS_=%Time:~6,2%
 Set HHMMSS=%Time:~0,2%%Time:~3,2%%Time:~6,2%
  
 Set WORK_FOLDER=%COMPUTERNAME%_%YYYYMMDD%_%HHMMSS%_"WORK"
 Set PAD=3
  
 Set SECEDIT_DB=%1
 
 Set SECEDIT_LIST=%2
 Set SECEDIT_LIST_WORK1="secedit_list_work1.txt"
 Set SECEDIT_LIST_WORK2="secedit_list_work2.txt"
 Set SECEDIT_LIST_WORK3="secedit_list_work3.txt"
  
 Set SECEDIT_TEXT="secedit_before_text.txt"
 Set SECEDIT_TEXT_WORK1="secedit_text_work1.txt"
 Set SECEDIT_TEXT_WORK2="secedit_text_work2.txt"
 Set SECEDIT_TEXT_WORK3="secedit_text_work3.txt"
 Set SECEDIT_TEXT_WORK4="secedit_text_work4.txt"
 Set SECEDIT_TEXT_IMPORT="secedit_import.txt"
 Rem =====================================================
  
 Cd /d %~dp0
 Mkdir %WORK_FOLDER%
 Cd %WORK_FOLDER%
 Rem Work Start
   Rem seceditコマンドよりSECEDIT_TEXTをエクスポート
   secedit /export /cfg %SECEDIT_TEXT%
 
   Rem SECEDIT_LISTのエンコードを変換したSECEDIT_LIST_WORK1を作成
   Start /min /wait Cmd /c chcp.com 932 ^& Cmd /c Type %SECEDIT_LIST% ^> %SECEDIT_LIST_WORK1%
   Rem SECEDIT_TEXTのエンコードを変換したSECEDIT_TEXT_WORK1を作成
   Start /min /wait Cmd /c chcp.com 932 ^& Cmd /c Type %SECEDIT_TEXT% ^> %SECEDIT_TEXT_WORK1%
 
   Rem SECEDIT_LIST_WORK1の項目名を保持するSECEDIT_LIST_WORK2を作成
   For /F "delims= " %%a IN ('type %SECEDIT_LIST_WORK1%') DO (
         @Echo %%a >> %SECEDIT_LIST_WORK2%
        )
 
   Rem SECEDIT_TEXT_WORK1から行番号を付加してSECEDIT_LIST_WORK2の内容を除外したSECEDIT_TEXT_WORK2を作成
   Findstr /N /V /B /G:%SECEDIT_LIST_WORK2% %SECEDIT_TEXT_WORK1% > %SECEDIT_TEXT_WORK2%
 
   Rem SECEDIT_LIST_WORK1の内容をSECEDIT_TEXT_WORK2に行番号を付加して追記
   For /F "tokens=1,2 delims=: " %%a IN ('Findstr /N /B /G:%SECEDIT_LIST_WORK2% %SECEDIT_TEXT_WORK1%') DO (
         Set CODENO=%%a
         For /F "delims=" %%q IN  ('Findstr %%b %SECEDIT_LIST_WORK1%') DO (
          Echo !CODENO!:%%q >> %SECEDIT_TEXT_WORK2%
          )
         )
 
   Rem SECEDIT_TEXT_WORK2の行番号を桁揃えしたSECEDIT_TEXT_WORK3を作成
   For /F "tokens=1,2 delims=:" %%a IN ('Type %SECEDIT_TEXT_WORK2%') DO (
         Set NUM=00000%%a
         Echo !NUM:~-%PAD%!:%%b >> %SECEDIT_TEXT_WORK3%
      )
 
   Rem SECEDIT_TEXT_WORK3をソートし、行番号を削除したSECEDIT_TEXT_WORK4を作成
   For /F "tokens=1,2 delims=:" %%a IN ('Sort %SECEDIT_TEXT_WORK3%') DO (
         Echo %%b >> %SECEDIT_TEXT_WORK4%
      )
 
   Rem SECEDIT_TEXT_WORK4をUNICODEに変換したSECEDIT_TEXT_IMPORTを作成
   Cmd /U /c Type %SECEDIT_TEXT_WORK4% > %SECEDIT_TEXT_IMPORT%
 
   secedit /configure /db %SECEDIT_DB% /cfg %SECEDIT_TEXT_IMPORT%
 Cd ../
Endlocal

実際に実行してみた。

実行前の状態。パスワードの制限があることがわかる。

secedit_list.txtの状態。ローカルセキュリティポリシーのテンプレートファイルの中で、変更したい箇所とその内容を記述しておく。

コマンドの実行画面。一つ目の引数にインポート先のデータベース名、二つ目の引数にsecedit_list.txtのフルパスを記述している。

実行後の状態。
パスワードの状態が変動している事が確認出来る。

PSexecのcオプションと組み合わせれば、複数台のマシンに対しローカルセキュリティポリシーの変更を行う事が可能になる。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。