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へ追加する。」を実行するわけです。かなり大変です。