- PR -

WMIにてSACLの値がnullになる場合とは

1
投稿者投稿内容
noir
会議室デビュー日: 2006/11/09
投稿数: 4
投稿日時: 2007-06-10 01:16
こんにちは。

Windows2003 SP1上で、WMIを使用したVBスクリプトをバッチから実行し、監査設定を取得しようとしています。しかし、実際に監査設定がされているにもかかわらず、下記のように動かし方によってSACLの値が入ったりnullになったりしてしまいます。

1.バッチを手動で実行すると、SACLの値は入る。
2.バッチをタスクに登録し、右クリックして一回実行すると、SACLの値は入る。
(Administratorで実行させるように設定(パスワードも正しい))
3.バッチをタスクに登録し、時間で実行させると、SACLの値がnullになる。
(Administratorで実行させるように設定(パスワードも正しい))
4.ターミナルサービスを使用してリモートから実行すると、SACLの値がnullになる。

どこに検討をつけて、何をなおしたらよいものやらさっぱりわからず、途方にくれております。

調査方法、怪しい箇所など、情報がありましたらよろしくお願い致します。

<<vbs(抜粋)>>

Set objWbemService = objWMIService.Get("Win32_LogicalFileSecuritySetting.path='" & args.item(1) & "'")
retval = objWbemService.GetSecurityDescriptor(objDescriptor)
Set SACL = objDescriptor.Properties_.Item("Sacl")

If isNull(SACL.Value) Then
WScript.Quit
End If
(nullのときは上記にて抜けてしまう)
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-10 02:01
Logon type の問題ですかね。

Task Scheduler での実行時には、Logon type が Batch になっていますし、Terminal Service の場合には、Remote Interactive になるはずです。

もっとも、Task Scheduler の場合にはすでに logon 済みの console session が新たに logon せずにそちらを優先的に使用しますが。

ただ、SACL ACE の配列を取得する段階で結果が返ってこないのは疑問です。
詳細に調査してみないとわかりませんね。


_________________
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-10 04:15
ちょっと調査してみました。

現象は確かに発生しますね。

Remote Desktop でも同じ account での console session が無いとこけますね。

ということで Process Monitor で trace を取ってみた解析しました。

結果、対象への Access System Security access の部分で PRIVILEGE NOT HELD が発生しているのが判明しました。

で、原因が特権にあるというのがわかったので、「特権使用の監査」を有効にして調査してみたところ、同じ account の console session がある場合には、自動的 (API 内部で勝手に行われる) に "SeSecurityPrivilege" が有効になりますが、同じ account の console session が無い場合には、"SeSecurityPrivilege" が有効にならないため、PRIVILEGE NOT HELD が発生します。

Logon type が Remote Interactive であろうと "SeSecurityPrivilege" 自体は使えることに変わりないのに、なぜこういう現象が発生するかは不明です。

ということで、明示的に "SeSecurityPrivilege" 特権を与えてみたらどうなるか?
と試してみると、見事 SACL が返ってきました。

後、細かいところですけど、

引用:

objWMIService.Get("Win32_LogicalFileSecuritySetting.path='" & args.item(1) & "'")



Windows の仕様では、'(single quotation) は path に使用できますので、"(double quotation) を利用したほうがいいでしょう。つまり

"Win32_LogicalFileSecuritySetting.path=""C:\\"""

のような感じです。
_________________
noir
会議室デビュー日: 2006/11/09
投稿数: 4
投稿日時: 2007-06-12 09:57
ご指摘どおり、SeSecurityPrivilegeをvbs内で付与したところ、正常にSACLの値がとれるようになりました。 大変助かりました。 どうもありがとうございます。

TechNetコラム(Hey, Scripting Guy!)に以下の記述があったのですが、SACLをとる場合も明示的にSeSecurityPrivilegeをつけなければいけない・・・のですかね。

*** 引用 ***
  Set objWMIService = GetObject("winmgmts:{(Security)}\\" & strComputer & "\root\cimv2")
セキュリティ イベント ログにアクセスする場合は、スクリプトに必ずこの特権を指定します。さらに、スクリプトを実行するには (少なくともユーザー アカウントが) セキュリティ イベント ログへのアクセス権を持っている必要があります。スクリプトに (Security) 特権を指定しても、スクリプトの実行者にセキュリティ イベント ログへのアクセス権が自動的に付与されるわけではありません。一方、この特権をスクリプトに指定しなければ、ユーザー アカウントにどのような権利、特権、アクセス許可が割り当てられていても、セキュリティ イベント ログにアクセスすることはできません。
(URL:http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/jan05/hey0126.mspx)

あと、テストしているときにわかったのですが、Administrator(バッチを起動ユーザー)ではなく別のユーザー(noir。Administratorsグループに所属)のコンソールセッションがある場合、上記の特権がなくてもSACLの値がとれてしました。(Usersグループの別ユーザーではだめでしたが・・・。)

何はともあれ、特権をつける方向で検討したいと思います。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-12 12:56
引用:

noirさんの書き込み (2007-06-12 09:57) より:
TechNetコラム(Hey, Scripting Guy!)に以下の記述があったのですが、SACLをとる場合も明示的にSeSecurityPrivilegeをつけなければいけない・・・のですかね。



WMI を使わず、SACL を扱う場合には SeSecurityPrivilege が有効になっていないといけません。

SACL Access Right [Security]

問題なのは、WMI の方でなぜ SeSecurityPrivilege を勝手に有効にする場合と有効にしない場合とがあるのかが不明です。

引用:

あと、テストしているときにわかったのですが、Administrator(バッチを起動ユーザー)ではなく別のユーザー(noir。Administratorsグループに所属)のコンソールセッションがある場合、上記の特権がなくてもSACLの値がとれてしました。(Usersグループの別ユーザーではだめでしたが・・・。)



「ユーザー権利の割り当て」で特権を持ってる user を確認してみるとよくわかるでしょう。

あと、特権に関してはその特権を保持していても有効になっていないと機能しないことに注意してください。

Administrators の member で SACL を取得できない場合があるのは、特権が有効になっていないからで、それ以外の member が取得できないのは、そもそも特権を所持していないからです。

_________________
ちゃっぴ@わんくま同盟
ちゃっぴの監禁部屋

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2007-06-12 14:59 ]
1

スキルアップ/キャリアアップ(JOB@IT)