読者です 読者をやめる 読者になる 読者になる

Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

VBScriptでフォルダの参照権限を参照する。Vol.3

これは2005年に投稿したエントリーで、以前のブログから引き継いだものです。

VBScriptでフォルダの参照権限を参照する。Vol.1
VBScriptでフォルダの参照権限を参照する。Vol.2

VBScriptで参照権限を変更するための残りの手順を解説です。基本的には今まで解説してきたことの延長にあるため、特に難しい部分はありません。プロパティへ代入する値さえ間違わなければ良いだけです。

例によって、参考文献はSubject:General Permission notes


まずは、対象となるアカウントのSID参照から。


1. 対象アカウントのSIDを取得する。
例によってWMIを利用しますが、ここではクエリーを利用します。ユーザー・オブジェクトがコレクションになっているので注意です。
コードにすると、こんな感じ。ドメイン、test_domainに所属するユーザー、test_playerの場合です。

set myWMI = getObject("winmgmts:\\[domain controller]\root\cimv2")
set myUsers = myWMI.execQuery("select * from win32_account where domain = 'test_domain' and name = 'test_player'")

for each u in myUsers
    set myUser = u
next

msgbox myUser.sid

2. 新規Trusteeオブジェクトを作成し、適切なプロパティを設定する。
Trusteeオブジェクトは、win32_trusteeクラスからインスタンスを生成することによって作成します。こんな感じです。

set myTrusteeClass = myWMI.get("win32_trustee")
set myTrustee = myTrusteeClass.spawnInstance_()

Trusteeオブジェクトに適切なプロパティを設定しなければなりませんが、文字列、バイナリーのSIDが必要です。先のmyUser.sidは文字列を返すだけなので、コレを利用してSIDオブジェクトを生成する必要が有ります。

set mySID = myWMI.get("win32_sid.sid = '" & myUser.sid & "'")

プロパティの設定は以下の通りです。

myTrustee.domain = mySID.ReferencedDomainName
myTrustee.name = mySID.AccountName
myTrustee.sid = mySID.BinaryRepresentation
myTrustee.sidLength = mySID.sidLength
myTrustee.sidString = mySID.sid

3. 新規ACEオブジェクトを作成し、適切なプロパティを設定する。
ACEオブジェクトもTrusteeオブジェクト同様、win32_aceオブジェクトからインスタンス生成して作成します。

set myAceClass = objWMI.get("win32_ace")
set myAce = myAceClass.spawnInstance_()

次にプロパティ設定ですが、ここで参照権限として設定したい値を代入することになります。例えば、Full Control権限を割り当てる場合は、

myAce.AccessMask = 2032127
myAce.trustee = myTrustee
myAce.AceType = 0
myAce.AceFlags = 3

です。

これらを設定してから、前エントリーの「4.ACEオブジェクトをDACLへ追加する。」を実行するわけです。かなり大変です。