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ランキング
-
プログラマーと学歴の関係性に...
-
プログラミングを教えたいです...
-
楽しくて最高のプログラミング...
-
小学1年生の子です。塾に行かせ...
-
vba クリップボードクリアにつ...
-
ラズパイpico PIOモード
-
pythonで複数画像からgifを作る...
-
Pythonでgif画像が上手く作れない
-
プログラミング ソースコード
-
プログラミング
-
正規表現で複数マッチ条件で悩...
-
Webサイト内に埋め込んだmp4動...
-
IT業界より楽に稼げる業界って...
-
JRのjsonファイルって使って大...
-
テキストファイルのファイル名...
-
昔のパソコン少年の武勇伝「店...
-
chatGPTで次々と質問をしていく...
-
pythonにてseleniumを使うも、...
-
ものづくりに向いているプログ...
-
windowsでテキストファイルの各...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
リストビューの列ヘッダーの幅...
-
構造体のコピー
-
共有フォルダの「共有のアクセ...
-
VB6で変数の配置転換
-
VB.netである関数を呼んで、そ...
-
文字列の中からある文字の個数...
-
ディレクトリ以下のファイル・...
-
VBAとVB6.0とC#の速度比較
-
tranlate関数で特定の文字を取...
-
C言語で10行10列の行列式の値を...
-
文字列を繰り返して表示する VBA
-
sublimit textっていうエディタ...
-
エクセルVBAでテキストボッ...
-
VBA public変数はどのようなこ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
Functionの戻り値を配列にした...
-
C#のループでtextboxに値を入れ...
-
チェックボックスを操作できな...
-
レコードセットにnullの場合
おすすめ情報