
No.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
No.3
- 回答日時:
実は
「WSH(VBScript)で共有フォルダを作成したい」の件で
後日色々調べてみたんです。
あの時、
『WSHにはアクセス許可の編集機能は無いと思うので』
って書いたことを後悔していたんですが、
タイミングよくenakoさんが質問してくれてよかったです。
もちろんローカルのアクセス許可も編集可能です。
No.2
- 回答日時:
できました。
完成版を書きますね。
'既存の共有フォルダのアクセス許可にユーザーを追加
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
この回答へのお礼
お礼日時:2004/03/16 09:26
ittochanさん、こんにちは。
更なる「大作」をありがとうございます。
やはり、WSHは奥が深いことを思い知ら
されました。時間がかかりそうですが、
必ずやこのスクリプトを自分のものに
してみせます!
どうもありがとうございました。
No.1
- 回答日時:
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
この回答へのお礼
お礼日時:2004/03/12 10:28
ittochanさん、こんにちは。
私にとって大作をどうもありがとうございます。
一筋縄ではいかないようですが、じっくり研究
し解読してみようと思います。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像生成AIのプロンプトの作り...
-
vba クリップボードクリアにつ...
-
Python... 環境設定 初心者です...
-
AIの登場でプログラマーたちが...
-
初心者powershellのPS1ファイル...
-
Geminiフォーム 画像生成で 人...
-
pythonの実行に関する質問
-
python3について。
-
iOSゲームアプリが作りたいと思...
-
Python 3.12.2 か一番最新のパ...
-
Google ColaboでGUI作成
-
数学、プログラミング、物理、...
-
pip --versionがエラーになる
-
OS入ってる機器のソフト・アプ...
-
パイソンのソースコードをChatG...
-
CSVファイルの複数行削除
-
pythonについて(初心者です)
-
MOVEコマンドでサブフォルダー...
-
プログラミング言語のバージョ...
-
AIがプログラムする時代のプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
リストビューの列ヘッダーの幅...
-
VBAとVB6.0とC#の速度比較
-
構造体のコピー
-
VB.netである関数を呼んで、そ...
-
<python> グローバル変数とロ...
-
C言語で10行10列の行列式の値を...
-
ディレクトリ以下のファイル・...
-
共有フォルダの「共有のアクセ...
-
繰返した処理分、コマンドボタ...
-
エクセルVBAでテキストボッ...
-
他のフォームから別のフォーム...
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
アクセスできない保護レベルエ...
-
C言語のサフィックスについて
-
ユーザーフォームへのデータ入...
-
VB.NETでのイベントの途中終了
-
【VB.NET】テキストボックスに...
-
二点の座標から距離や角度を求...
-
チェックボックスを操作できな...
おすすめ情報