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
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
ittochanさん、こんにちは。
私にとって大作をどうもありがとうございます。
一筋縄ではいかないようですが、じっくり研究
し解読してみようと思います。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 外部ドライブにマウントできない問題について 9 2022/03/22 18:08
- ネットワーク 家庭内LANの2台のPC間で「ネットワーク資格情報の入力」で引っかかってフォルダが共有できない 1 2022/12/11 23:37
- その他(クラウドサービス・オンラインストレージ) OneDriveのアクセス権限の変更について教えてください! 1 2023/03/02 13:49
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- Google Drive googleドライブ 共有フォルダ 表示 されない 2 2023/07/06 10:37
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(ブラウザ) このページは動作していません HTTP ERROR 401 2 2022/11/28 12:11
- フリーソフト イーファンビューでwebpファイルが開けません 1 2022/07/12 07:07
- サーバー Windows Server 2019 CALについて 3 2022/04/02 16:40
- Android(アンドロイド) AQUOS SH08 を使っています。 写真をSDカードに保存していたのですがなにかの拍子に「写真を 2 2022/05/25 13:33
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で10行10列の行列式の値を...
-
リストビューの列ヘッダーの幅...
-
VB6で変数の配置転換
-
【VB6.0】 あるフォームから他...
-
C#のループでtextboxに値を入れ...
-
二点の座標から距離や角度を求...
-
VB.NETでのイベントの途中終了
-
エクセルVBAでテキストボッ...
-
C言語のサフィックスについて
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
pthread_cond_waitとptherad_co...
-
VC++ (byte)(col & 0xFF) の意味
-
Pythonでのstrip()とsplit()の...
-
perlによるxmlファイルの取得
-
sublimit textっていうエディタ...
-
レコードセットにnullの場合
-
タイムアウトする仕組みを作りたい
-
String型の値にスラッシュをつ...
-
アクセスできない保護レベルエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
リストビューの列ヘッダーの幅...
-
共有フォルダの「共有のアクセ...
-
文字列を繰り返して表示する VBA
-
C言語で10行10列の行列式の値を...
-
構造体のコピー
-
ディレクトリ以下のファイル・...
-
VBL ListBoxをテーブルに
-
VB6で変数の配置転換
-
文字列の中からある文字の個数...
-
VB.netである関数を呼んで、そ...
-
tranlate関数で特定の文字を取...
-
三項でたとえば交換って
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
C言語のサフィックスについて
-
レコードセットにnullの場合
-
エクセルVBAでテキストボッ...
-
Functionの戻り値を配列にした...
おすすめ情報