ラベル WSH の投稿を表示しています。 すべての投稿を表示
ラベル WSH の投稿を表示しています。 すべての投稿を表示

2009年6月20日土曜日

Windows コマンドラインから 「パスワードを無期限にする」を有効にする

何を言わんか、判る人にはわかるだろう。 net user コマンドにはこの機能がないのだ。
 

先日とある切欠で wmic の存在を思い出し、記事タイトルのことが出来るのかやってみた。
WMICodeCreator でWMIの中身をチェック、Win32_UserAccount の PasswordExpires を更新すればよい ことはわかっているので、WSHからは既にやっていたんだが、wmic を使えばコマンド1行でOKなのがいい。
 

wmic では Win32_UserAccount のエイリアスは useraccount だ。
なのでコマンドはこうなる。
 

wmic useraccount where (Name = "hogehoge") set PasswordExpires=False
 
 


では、コンピュータ名 "TESTPC" で ユーザー "hogehoge" のアカウントプロパティ「パスワードを無期限にする」にチェックを入れてみよう。
 

C:\>wmic useraccount where (Name = "hogehoge") set PasswordExpires=False
'\\TESTPC\ROOT\CIMV2:Win32_UserAccount.Domain="TESTPC",Name="hogehoge"' のプロパティを更新しています
プロパティは正しく更新されました。

 

C:\>wmic useraccount where (Name = "hogehoge") get PasswordExpires
PasswordExpires
FALSE

 

はいオッケィ。
これで、ユーザ管理画面を開かずにユーザ作成、グループに追加、パスワード無期限 をコマンドラインだけで出来て、あの面倒な「コンピュータの管理」を開かないで済むのだ。
 

2008年12月4日木曜日

VBScript で FizzBuzz

FizzBuzz って言うのがあるというのを知った、 今夜わかるセキュアプログラミング - うさぎ文学日記 を見て。

1から100までの数を表示するプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と表示。
5の倍数のときは「Buzz」と表示。
3と5両方の倍数の場合には「FizzBuzz」と表示すること。

 

VBScriptで書いてみた、前述資料にPerlでの答えが書いてあったからインチキだけど。
[sourcecode language='vb']
for i=1 to 100
'// 文字列初期化
strTemp = ""

'// 3の倍数ならFizzを文字列に追加
if (i mod 3) = 0 Then
strTemp = "Fizz"
End if

'// 5の倍数ならBuzzを文字列に追加
if (i mod 5) = 0Then
strTemp = strTemp & "Buzz"
End if

'// ここで文字列が空っぽなら数字を代入
if strTemp = "" Then
strTemp = i
End if

'// 表示用の一列作成
strResult = strResult & i & VbTab & strTemp & VbCrLf
Next

'// 表示
Msgbox strResult,,"FizzBuzz"

Wscript.Quit
[/sourcecode]
 

実行するとこうなる、スペースの都合で1-30までの表示としてます。
[caption id="attachment_1097" align="alignnone" width="130" caption="画像:FizzBuzz"]画像:FizzBuzz[/caption]
 

うん、アプローチは色々ありそうだけど、まあできてるんでないの。

2008年11月7日金曜日

IISのアプリケーションプールを開始するVBScript(WMI)

IISのアプリケーションプールが勝手に止まったりする事あります?
滅多に無いけどたまにある。そうか、わかるよ多分わかる。
 

止まっているアプリケーションプールを検出して自動で開始してくれるスクリプトを書いたのでエントリ。スケジュールタスクに登録して適度な間隔で実行すれば、簡易IIS監視体制の完成。
拡張子"vbs"で保存して実行してください、コマンドラインから実行もできるのでわりと便利。
[sourcecode language='vb']
strComputer = "."

set locatorObj = CreateObject("WbemScripting.SWbemLocator")
set providerObj = locatorObj.ConnectServer(strComputer, "root/MicrosoftIISv2")

Set colItems = providerObj.ExecQuery _
("Select * From IIsApplicationPoolSetting")

For Each objItem in colItems
if objItem.AppPoolState="4" Then
set nodeObj = providerObj.Get("IIsApplicationPool='" & objItem.name & "'")
nodeObj.start
end if
Next
[/sourcecode]

 

止まった原因はちゃんと調べたほうがいいけど、取りあえず動いておいて欲しいのも人情。
応用として、WQLにWhere句を使えば狙ったアプリケーションプールのみを監視できる。
(※Where name = 'hogehoge' とか name like ''%hoge% とか)
 

解説は参考情報を見てもらえると詳しく書いてあります、というかほぼMSDNからコピペ組み立てですけど。

2008年9月9日火曜日

イベントログを詳細付きでCSVに出力、ツール追加なし@WindowsServer

イベントログをゆっくり見ようと思ったら、CSV→Excelとかにしたくなる。
しかし標準のイベントビュアー付属のファイル出力機能を使っても、スカスカなものが出来上がる。はっきり言って使い物にならない。
こんなときLogParserがやっぱり便利なんだけど、入れてないサーバもある。
人様のサーバだったりすると勝手に入れるのはアカンし、よい場合でもLogParser落として入れてパス通して… といちいちやるのも結構面倒、急いでいるときはなおさら。
 
 

ってことで、"eventquery.vbs":リンク/TechNet の使い方をメモ。
あまり使わないのでいつも使い方を忘れて何度も日時で引っかかる。このツールでは「年/月/日」ではなくて「月/日/年」で指定するんだぞ自分よ。あと一日の始まりは「12:00AM」だからよろしく。
 
 

?オプションで起動してヘルプを出す
>cscript %systemroot%\system32\eventquery.vbs /?

Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.


EVENTQUERY.vbs [/S システム [/U ユーザー名 [/P パスワード]]] [/V] [/FI フィルタ]
[/FO 形式] [/R 範囲] [/NH] [/L ログ名 | *]

説明:
EVENTQUERY.vbs スクリプトにより、管理者は 1 つ以上のイベント
ログ中のイベントとイベントのプロパティを一覧表示できます。

パラメータ一覧:
/S サーバー 接続先のサーバーを指定します。

/U [ドメイン\]ユーザー コマンドが実行されるユーザー
のコンテキストを指定します。

/P パスワード 指定のユーザー コンテキストの
パスワードを指定します。

/V 詳細情報を表示します。出力時に詳細情報を
画面に表示するように指定します。


/FI フィルタ クエリによりフィルタして取り込むまたは
除外するイベントの種類を指定します。

/FO 形式 出力を表示する形式を指定します。
有効な形式は "TABLE"、"LIST" および
"CSV" です。

/R 範囲 一覧表示するイベントの範囲を指定します。
有効な値:
'N' - 最近の N 個のイベントを一覧表示します。
'-N' - 最古の N 個のイベントを一覧表示します。
'N1-N2' - N1 から N2 のイベントを一覧表示します。

/NH "列ヘッダー" が出力に表示されないように指定
します。
"TABLE" および "CSV" の形式にのみ有効です。

/L ログ名 照会するログを指定します。

/? このヘルプ/使用法を表示します。

有効なフィルタ 使用できる演算子 有効な値
------------- ------------------ ------------
DATETIME eq,ne,ge,le,gt,lt MM/dd/yy(yyyy),hh:mm:ssAM(/PM)
TYPE eq,ne SUCCESS, ERROR, INFORMATION,
WARNING, SUCCESSAUDIT,
FAILUREAUDIT
ID eq,ne,ge,le,gt,lt 負でない整数(0 - 65535)
USER eq,ne 文字列
COMPUTER eq,ne 文字列
SOURCE eq,ne 文字列
CATEGORY eq,ne 文字列

注意: フィルタ "DATETIME" は "開始日- 終了日" のように指定可能です。
この形式では "eq" 演算子のみ利用可能です。

例:
EVENTQUERY.vbs
EVENTQUERY.vbs /L system
EVENTQUERY.vbs /S system /U user /P password /V /L *
EVENTQUERY.vbs /R 10 /L Application /NH
EVENTQUERY.vbs /R -10 /FO LIST /L Security
EVENTQUERY.vbs /R 5-10 /L "DNS Server"
EVENTQUERY.vbs /FI "Type eq Error" /L Application
EVENTQUERY.vbs /L Application
/FI "Datetime eq 08/15/02,03:15:00AM-08/15/02,03:15:00PM"
EVENTQUERY.vbs /FI "Datetime gt 07/04/02,04:27:00PM"
/FI "Id gt 700" /FI "Type eq warning" /L System
EVENTQUERY.vbs /FI "Type eq error OR Id gt 1000 "

 

特に難しい使い方はしない、冒頭の日時の指定さえ迷わなければ問題ない。
とりあえず今日(2008年9/9)のイベントログを表示してみる。
コマンドプロンプトから、
>cscript %systemroot%\system32\eventquery.vbs /FI "Datetime ge 09/09/2008,12:00:00AM"

これで今日記録されたイベントログだけ出力される、これだけだと詳細は出ないしフォーマットはCSVではないけど。
eventquery.vbs は System32 においてあるので、cscriptから立ち上げるためフルパスで指定してます。
 
 

イベントログの詳細を含めてCSVにしたい場合


>cscript //nologo %systemroot%\system32\eventquery.vbs /FI "Datetime gt 09/09/2008,12:00:00AM" /V /FO CSV

"/V" で詳細込み、"/FO CSV" でCSVフォーマット指定と。後はこれをリダイレクトでファイルに落とせばOK。
"/FI" はフィルタ。条件を複数指定したいときは "/FI 条件1 and 条件2" と書いてもいいし、 "/FI 条件1 /FI 条件2" としてもOKみたい。or は前者でしか使えないかも、オプション複数は and だった。
 
 


追記:
前は上記の内容で 年/月/日 の指定を MM/DD/YY で書いていたが、Wshの仕様でYYが2桁だと正確な年にならない、詳しくはコメントで。
指摘を貰ったので本文修正しました。





 



 
しかし、過去記事を並べてみて思う。

  1. WindowsバッチファイルでYYYYMMDD で日付を文字列にして条件指定とファイル名に使う

  2. この記事の "eventquery.vbs" でイベントログを1日分ダンプする。

  3. Forfilesコマンドで古いログを自動で削除 する


アラ、これは便利なものができたかもしれない。ログローテーションバッチ。
普段使ってるのはVBScriptで書いてるけど、この流れならソラで書ける。
セキュリティ認証とかのため、とりあえずでよいからログの保管、というポリシーが必要な場合に片手間で仕込めますね。
 
 

丸々1日分のログをとる場合、日付が変わってからVBScriptなどで前日の文字列作成するのが普通なのかもしれないしそんなに手間でもないが、バッチでも次の方法でいけるかな?
 
タスクスケジューラで「毎日23:59」にバッチ開始、日付文字列を変数に格納してログファイル名やらをまず作成。
eventqueryの直前に、リソースキットだったかサポートツールだったかについてくる、
sleep 60」 で。
 

2008年8月31日日曜日

IISのログファイルをタスクで月ごとに圧縮する

WindowsServer2003 に付属のHTTP他もろもろサーバ、IIS6を長いこと動かすとログがたまってくる。logrotateみたく圧縮ローテーション&自動削除ならいいのに。
 
サイトが少しならいいけど、サーバに何十とWEBサイトを作るとログファイルは結構な量になるので、容量はかさむしNTBackupにかかる時間は延びるし運用上よろしくない。
 
ということから作成して使っていたVBScriptを公開する。目的の大半は自分があとで使いまわすためですが、興味がある人は使ってみたらよいと思います。
WindowsServer2008+IIS7の環境でも動作することを確認。これでまだしばらく使い物になる。
cabarc.exeは取りあえずMicrosoft Cabinet SDKのものを使った。2008のサポートツールにも入ってるのかな?

 
 

一応、スクリプトの使い方と処理内容を記述しておく。
 
使い方は叩くだけ、丸々一カ月分/約30のログファイルが1つの cab ファイルにまとまる。
ログファイルの場所は特に指定しないでよい。
 
処理は下記の流れでやっている。

  1. WMIでIISのWEBサイト設定から、ログファイルの保存フォルダを取得

  2. 先月分のログファイルがあるか確認する
    例) 現在時刻が2008年8月に実行した場合、"ex200807*.log" に該当するファイルを探す

  3. 全部cabに圧縮して、成功したら元のログファイルを消去

  4. 1から3の処理をIIS上のWEBサイトすべてに対して繰り返す


 

なお、このスクリプトを使うにはサポートツールがいるので事前に導入しておく必要がある。
 
ほか、FTPのログも対象にしているのでFTPのサイトがないとエラーになる。IISのFTPを使っていない場合はFTPのところは消すべし、"objFTPsvc" の定義と、2つ目の大きなループを消せばOK.
 
 

以下スクリプト、拡張子VBSで保存して実行する。

2008年7月28日月曜日

Windows、VBScriptでYYYYMMDD

YYYYMMDD(hhmm)。シリーズ。
ログファイルを出力するなら「これ+プリフィックス」をファイル名にするのが理想ではないでしょうか。
のVBScript、WSH編。
 
サンプルの下記テキストを.VBSで保存して実行します。


[sourcecode language='vb']
'/// 年月日 作成
tmpYYYYMMDD = year(now()) & Right(00 & month(now()), 2) & Right(00 & day(now()), 2)

'/// 時分 作成
tmpHHMM = Right(00 & hour(now()), 2) & Right(00 & minute(now()), 2)

'/// 合成
strDate = tmpYYYYMMDD & tmpHHMM
Wscript.echo strDate
[/sourcecode]

 
もともと便利な関数はありますが、少し表示の癖を吸収する必要が。実行結果は下記。
[caption id="attachment_447" align="alignnone" width="167" caption="画像:スクリプトの実行結果"]画像:スクリプトの実行結果[/caption]
 
 
以降解説へ。