- PR -

特定のユーザーにアクセス許可を追加したい

1
投稿者投稿内容
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 2005-03-11 11:27
<開発環境>
WINDOWS 2000
VB.NET 2003

いつもお世話になっております。

既存のフォルダに存在するユーザーに、フルコントロールのアクセスをプログラムから許可
したいと思っています。こちらはローカル単位での操作です。

microsoftのサポートを参考にして作成したのですが、途中でこけてしまい
理由がわからず、困っています。

[HOWTO] Microsoft Visual Basic .NET のプログラムを使用して、NTFS ファイル システムのフォルダのアクセス許可を設定する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;818362

以下にコードを記します。長いので恐縮ですが、お願いします。
Sub SetPermissions(ByRef vPath As String, ByVal UserName As String)
Dim objDAcl As AccessControlList
Dim objAce As Object
Dim objAce1 As AccessControlEntry
Dim objAce2 As AccessControlEntry
Dim objSId As ADsSID
Dim objSIdHex As Object
Dim objAdsSec As ADsSecurity
Dim objSecDes As

Const ADS_SID_SAM = 2
Const ADS_SID_SDDL = 4
Const ADS_RIGHT_GENERIC_ALL = &H10000000
Const ADS_ACETYPE_ACCESS_ALLOWED = &H0
Const ADS_ACEFLAG_INHERIT_ACE = &H2
Const ADS_ACEFLAG_INHERIT_ONLY_ACE = &H8

objAdsSec = New ADsSecurity
objSecDes = New Object
objSecDes = objAdsSec.GetSecurityDescriptor("FILE://" & vPath)
               ↑
    ここでコケてしまいます。エラーは「オブジェクト参照がインスタンスに設定されて
    いません」とゆうエラー内容です。
objDAcl = objSecDes.DiscretionaryAcl
objSId = New ADsSID
objSId.SetAs(ADS_SID_SAM, CStr(UserName))
objSIdHex = objSId.GetAs(ADS_SID_SDDL)
' Add a new objAce so that the User has Full Control on NTFS Files.
objAce1 = New AccessControlEntry
objAce1.Trustee = CStr(objSIdHex)
objAce1.AccessMask = ADS_RIGHT_GENERIC_ALL
objAce1.AceType = ADS_ACETYPE_ACCESS_ALLOWED
objAce1.AceFlags = ADS_ACEFLAG_INHERIT_ACE Or ADS_ACEFLAG_INHERIT_ONLY_ACE Or 1
objDAcl.AddAce(objAce1)
objAce2 = New AccessControlEntry
objAce2.Trustee = CStr(objSIdHex)
objAce2.AccessMask = ADS_RIGHT_GENERIC_ALL
objAce2.AceType = ADS_ACETYPE_ACCESS_ALLOWED
objAce2.AceFlags = ADS_ACEFLAG_INHERIT_ACE Or 1
objDAcl.AddAce(objAce2)
objSecDes.DiscretionaryAcl = objDAcl
objAdsSec.SetSecurityDescriptor(objSecDes)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
SetPermissions("<%test%>", "SHIRAGAMI\\Everyone")
MsgBox("Full Access control granted.")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

直前でNewしているので上記のエラーがなぜでるのかわかりません。
どなたかお教えいただけませんでしょうか?
よろしくお願いいたします。
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 2005-03-11 15:06
自己スレです。

関数の呼び出し時、引数の値がダメだったようです。

Sub SetPermissions(ByRef vPath As String, ByVal UserName As String)
Dim objDAcl As AccessControlList = New AccessControlList
Dim objAce1 As AccessControlEntry
Dim objAce2 As AccessControlEntry
Dim objSId As ADsSID
Dim objSIdHex As String
Dim objAdsSec As ADsSecurity = New ADsSecurity
Dim objSecDes As SecurityDescriptor
Const ADS_SID_SAM = 2
Const ADS_SID_SDDL = 4
Const ADS_RIGHT_GENERIC_ALL = &H10000000
Const ADS_ACETYPE_ACCESS_ALLOWED = &H0
Const ADS_ACEFLAG_INHERIT_ACE = &H2
Const ADS_ACEFLAG_INHERIT_ONLY_ACE = &H8
objSecDes = CType(objAdsSec.GetSecurityDescriptor("FILE://" & vPath), SecurityDescriptor)
objDAcl = CType(objSecDes.DiscretionaryAcl, AccessControlList)
objSId = New ADsSID
objSId.SetAs(ADS_SID_SAM, CStr(UserName))
objSIdHex = CStr(objSId.GetAs(ADS_SID_SDDL))
' Add a new objAce so that the User has Full Control on NTFS Files.
objAce1 = New AccessControlEntry
objAce1.Trustee = objSIdHex
objAce1.AccessMask = ADS_RIGHT_GENERIC_ALL
objAce1.AceType = ADS_ACETYPE_ACCESS_ALLOWED
objAce1.AceFlags = ADS_ACEFLAG_INHERIT_ACE Or ADS_ACEFLAG_INHERIT_ONLY_ACE Or 1
objDAcl.AddAce(objAce1)
' Add a new objAce so that the User has Full Control on NTFS Folders.
objAce2 = New AccessControlEntry
objAce2.Trustee = CStr(objSIdHex)
objAce2.AccessMask = ADS_RIGHT_GENERIC_ALL
objAce2.AceType = ADS_ACETYPE_ACCESS_ALLOWED
objAce2.AceFlags = ADS_ACEFLAG_INHERIT_ACE Or 1
objDAcl.AddAce(objAce2)
objSecDes.DiscretionaryAcl = objDAcl
' Set Permissions on the NTFS folder.
objAdsSec.SetSecurityDescriptor(objSecDes)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
SetPermissions("C:\test2", "Domain\UserName")
                        ↑
                 ここの部分です。
 
MsgBox("Full Access control granted.")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

今度はロジックは通ったのですが、うまくアクセス許可が設定されません。
どなたか、ご指摘をお願いします。
パクジン
ベテラン
会議室デビュー日: 2004/08/19
投稿数: 50
投稿日時: 2005-03-11 18:00
自己レスです。

できました。上記の記述でよかったようです。
一度目がなぜいけなかったのか謎ですが、、、。

考えていただいた方、
ありがとうございました。

またどなたか参考にしていただけたら幸いです。
1

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