教えて! goo のコンテンツに対する取り組みについて

こんにちは。
OSはWindows2000 Proです。
共有フォルダを作成し、NTFSのアクセス権を
caclsコマンドで一括変更する処理は可能です
が、共有タブにあるアクセス許可で、同じよう
にアクセス権を変更するバッチファイルを作成
したいのですが、どのようなコマンドを使用す
ればよろしいでしょうか?
よろしくお願いいたします。

gooドクター

A 回答 (4件)

ANo.#2には問題があったので


書き直しました。

Option Explicit

Dim Services
Dim SecDescClass
Dim SecDesc
Dim Trustee
Dim ACE1
Dim ACE2
Dim Share
Dim InParam

Const FolderName = "C:\public"
Const ImpLevel = "{impersonationLevel=impersonate}"
Const namespace = "!root\cimv2:"
Const ComputerName = "ittochan"
Const ShareName = "Pubs"

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!\\.\ROOT\CIMV2")
Set SecDescClass = Services.Get("Win32_SecurityDescriptor")
Set SecDesc = SecDescClass.SpawnInstance_()

Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = Null
Trustee.Name = "Administrators"
Trustee.Sid = getSID(Trustee.Name)

Set ACE1 = Services.Get("Win32_Ace").SpawnInstance_
ACE1.AccessMask = 2032127
ACE1.AceFlags = 3
ACE1.AceType = 0
ACE1.Trustee = Trustee

Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = ComputerName
Trustee.Name = "Everyone"

Trustee.SID = getSID(Trustee.Name)

Set ACE2 = Services.Get("Win32_Ace").SpawnInstance_
ACE2.AccessMask = 2032127
ACE2.AceFlags = 3
ACE2.AceType = 0
ACE2.Trustee = Trustee
'
SecDesc.DACL = Array(ACE1,ACE2)

Set Share = Services.Get("Win32_Share")
Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_()
InParam.Properties_.Item("Access") = SecDesc
InParam.Properties_.Item("Description") = "Public Share"
InParam.Properties_.Item("Name") = ShareName
InParam.Properties_.Item("Path") = FolderName
InParam.Properties_.Item("Type") = 0
InParam.Properties_.Item("MaximumAllowed") = 5
Share.ExecMethod_ "Create", InParam

WScript.Quit

function getSID(ByVal strUserName)
dim objWMIService
dim colAccount , colItems , objItem
dim ClasSID , strMoniker , strSID , obj
dim instance

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colAccount = objWMIService.ExecQuery( _
"Select * from Win32_Account where name='" & strUserName & "'")
for each obj in colAccount
if LCase(obj.name)=LCase(strUserName) then
strSID = obj.SID
end if
next
if strSID="" then
WScript.Echo strUserName & "というユーザー名または、グループ名が見つかりません"
WScript.Echo "失敗しました"
WScript.Quit
else
strMoniker = "winmgmts:" & ImpLevel & namespace & _
"Win32_SID.SID='" & strSID & "'"
Set instance = GetObject(strMoniker)
getSID=instance.BinaryRepresentation
end if
end function
    • good
    • 0

実は


「WSH(VBScript)で共有フォルダを作成したい」の件で
後日色々調べてみたんです。
あの時、
『WSHにはアクセス許可の編集機能は無いと思うので』
って書いたことを後悔していたんですが、
タイミングよくenakoさんが質問してくれてよかったです。

もちろんローカルのアクセス許可も編集可能です。
    • good
    • 0

できました。


完成版を書きますね。

'既存の共有フォルダのアクセス許可にユーザーを追加
Option Explicit

Dim i,j
Dim FSO
Dim Services
Dim SecDescClass
Dim SecDesc
dim wmiAce
dim wmiTrustee
Dim Trustee
Dim ACE
Dim Trustee1
Dim ACE1
dim strMoniker
dim wmiShareSecSetting
dim RetVal
Dim DACL
Dim controlFlags
Dim accessmask
Dim Group
Dim Owner
Dim SACL
Dim number_of_trustees
Dim trustee_Domain
Dim trustee_Name
Dim trustee_Sidstring
Dim strACL
Dim wmiSecurityDescriptor
dim strSID

'' アクセス権のマスク
Const FULLACCESS = 2032127 '' フルアクセス(All)
Const READ = 1179817 '' 読み取り(RX)
Const UPDATE = 1245631 '' 変更(RWXD)

Const ComputerName = "ittochan"
Const ShareName = "Pubs"

Const ImpLevel = "{impersonationLevel=impersonate}"
Const namespace = "!root\cimv2:"
Const objectpath = _
"Win32_LogicalShareSecuritySetting=""Pubs"""
strMoniker = "winmgmts:" & ImpLevel & namespace & objectpath

Set wmiShareSecSetting = GetObject (strMoniker)

'' セキュリティディスクリプタを取得し、wmiSecurityDescriptorに格納する。
RetVal = wmiShareSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)
If Err <> 0 Then
WScript.Echo "GetSecurityDescriptor failed" & VBCRLF & Err.Number & VBCRLF & Err.Description
WScript.Quit
Else
WScript.Echo "GetSecurityDescriptor suceeded"
End If

'' セキュリティディスクリプタから情報を取得する。
DACL = wmiSecurityDescriptor.DACL ' get dacl

DispDACL

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & "\\" & ComputerName & "\ROOT\CIMV2")

'既存のACLを上書きする
j=0
For each wmiAce in DACL
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Set wmiTrustee = wmiAce.Trustee
Trustee.Domain = wmiTrustee.Domain
Trustee.Name = wmiTrustee.Name

Trustee.SID = wmiTrustee.SID
ACE.AccessMask = wmiAce.AccessMask
''Everyoneのアクセス権をフルアクセスに変更する
'if Trustee.Name="Everyone" then
'ACE.AccessMask = FULLACCESS
'end if
ACE.AceFlags = wmiAce.AceFlags
ACE.AceType = wmiAce.AceType
ACE.Trustee = Trustee

wmiSecurityDescriptor.DACL(j) = ACE
j=j+1
Next

'新しいACLを作成
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = ComputerName
Trustee.Name = "Administrator"
Trustee.Sidstring = getSID(Trustee.Name)

ACE.AccessMask = READ
ACE.AceFlags = 3
ACE.AceType = 0
ACE.Trustee = Trustee

'DACLに追加する
wmiSecurityDescriptor.DACL(j) = ACE

retval = wmiShareSecSetting.setsecuritydescriptor(wmiSecurityDescriptor)
If retval = 0 Then
WScript.Echo "成功しました。"
WScript.Echo ""
DispDACL
Else
WScript.Echo "セキュリティ設定を変更できませんでした。"
End If

Set wmiShareSecSetting = Nothing

WSCript.Quit

sub DispDACL()
Set wmiShareSecSetting = GetObject (strMoniker)
'' セキュリティディスクリプタを取得し、wmiSecurityDescriptorに格納する。
RetVal = wmiShareSecSetting.GetSecurityDescriptor(wmiSecurityDescriptor)

'' セキュリティディスクリプタから情報を取得する。
DACL = wmiSecurityDescriptor.DACL ' get dacl

For each wmiAce in DACL
Set wmiTrustee = wmiAce.Trustee
strSID=""
For i = 0 To UBound(wmiTrustee.SID) - 1
strSID = strSID & wmiTrustee.SID(i) & ","
Next
strSID = strSID & wmiTrustee.SID(i)

'アクセスマスクの取得
accessmask = wmiAce.AccessMask ' Save the accessmask

' アクセスマスクをアクセス権表示文字列に変換する。
Select Case accessmask
Case FULLACCESS
strACL = "フルコントロール(All)"
Case READ
strACL = "読み取り(RX)"
Case UPDATE
strACL = "変更(RWXD)"
Case Else
strACL = accessmask
End Select

WScript.Echo "Domain:" & wmiTrustee.Domain & vbNewLine _
& "Name:" & wmiTrustee.Name & vbNewLine _
& "SID:" & strsid & vbNewLine _
& "Sidstring:" & wmiTrustee.Sidstring & vbNewLine _
& "ACL:" & strACL & vbNewLine _
& "AccessMask:" & accessmask
Next
end sub
function getSID(ByVal strUserName)
dim objWMIService
dim colUserAccount
dim colGroup
dim obj

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colUserAccount = objWMIService.ExecQuery("Select * from Win32_UserAccount")
for each obj in colUserAccount
if LCase(obj.name)=LCase(strUserName) then
getSID = obj.SID
exit function
end if
next
Set colGroup = objWMIService.ExecQuery("Select * from Win32_Group")
for each obj in colGroup
if LCase(obj.name)=LCase(strUserName) then
getSID = obj.SID
exit function
end if
next
WScript.Echo strUserName & "というユーザー名または、グループ名が見つかりません"
WScript.Echo "失敗しました"
WScript.Quit
    • good
    • 0
この回答へのお礼

ittochanさん、こんにちは。
更なる「大作」をありがとうございます。
やはり、WSHは奥が深いことを思い知ら
されました。時間がかかりそうですが、
必ずやこのスクリプトを自分のものに
してみせます!
どうもありがとうございました。

お礼日時:2004/03/16 09:26

WindowsXP+WSH+WMI


を使用したVBScriptでしたら可能です。
多分Windows2000でも動くでしょう。

↓は
C:\Publicフォルダを新規作成し、
共有フォルダPubsとして構成、
共有フォルダのアクセス許可リストに
フルコントロールのEveryoneを追加しています。

他のユーザーの追加方法はいまのところ分かりません。
すでにアクセス許可リストに登録されているユーザーなら変更することが可能なんですが・・・・

Option Explicit

Dim FSO
Dim Services
Dim SecDescClass
Dim SecDesc
Dim Trustee
Dim ACE
Dim Share
Dim InParam
Dim Network

Const FolderName = "C:\Public"
Const ComputerName = "ittochan"
Const ShareName = "Pubs"

Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(FolderName) Then
FSO.CreateFolder(FolderName)
End If

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & "\\" & ComputerName & "\ROOT\CIMV2")
Set SecDescClass = Services.Get("Win32_SecurityDescriptor")
Set SecDesc = SecDescClass.SpawnInstance_()
Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
Trustee.Domain = ComputerName
Trustee.Name = "EVERYONE"
Trustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = 2032127
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
SecDesc.Properties_.Item("DACL") = Array(ACE)
Set Share = Services.Get("Win32_Share")
Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_()
InParam.Properties_.Item("Access") = SecDesc
InParam.Properties_.Item("Description") = "Public Share"
InParam.Properties_.Item("Name") = ShareName
InParam.Properties_.Item("Path") = FolderName
InParam.Properties_.Item("Type") = 0
Share.ExecMethod_ "Create", InParam
    • good
    • 0
この回答へのお礼

ittochanさん、こんにちは。
私にとって大作をどうもありがとうございます。
一筋縄ではいかないようですが、じっくり研究
し解読してみようと思います。
どうもありがとうございました。

お礼日時:2004/03/12 10:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング