Войти

Показать полную графическую версию : [решено] Помогите со скриптом для расшаривания


Castor
12-08-2009, 22:56
Один хороший скрипт для расшаривания папки и назначения прав (доступа и NTFS) выдает ошибку C:\scripts\VB\share\shara_r.vbs(61, 1) (null): 0x80041002

текст скрипта -

Option Explicit

Const FILE_SHARE = 0
Const MAXIMUM_CONNECTIONS = 15
Const strDomain = "local.loc"
Const PERM_READ = 1179817
Const PERM_MODIFY = 1245631
Const PERM_FULL = 2032127


Dim strComputer
Dim objWMIService
Dim objNewShare


strComputer = "pc001"

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewShare = objWMIService.Get("Win32_Share")

'Worked Example
Call sharesec ("C:\scripts", "Scripts", "Only Scripts", "My Scripts", Perm_Read, Perm_Modify)

Sub sharesec(Fname, shr, info, account, Share_Perm, NTFS_Perm)
Dim FSO
Dim Services
Dim SecDescClass
Dim SecDesc
Dim Trustee
Dim ACE
Dim Share
Dim InParam
Dim Network
Dim FolderName
Dim AdminServer
Dim ShareName
Dim FolderSecurity
Dim RetVal
Dim SecurityDescriptor
Dim User

FolderName = Fname
AdminServer = "\\" & strComputer
ShareName = shr

'Write New security descriptor for the FolderName

Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & AdminServer & "\ROOT\CIMV2")
Set SecurityDescriptor = Services.Get("Win32_SecurityDescriptor")

Set FolderSecurity = GetObject("winmgmts:Win32_LogicalFileSecuritySetting.Path='" & FolderName & "'")
RetVal = FolderSecurity.GetSecurityDescriptor(SecurityDescriptor)

Set Trustee = SetGroupTrustee(strDomain, account) 'Use SetGroupTrustee for groups and SetAccountTrustee for users
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = NTFS_Perm
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
SecurityDescriptor.Properties_.Item("DACL") = Array(ACE)

RetVal = FolderSecurity.SetSecurityDescriptor(SecurityDescriptor)

'Create new Share

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

Set Trustee = SetGroupTrustee(strDomain, account) 'Use SetGroupTrustee for groups and SetAccountTrustee for users
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = Share_Perm
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") = Info
InParam.Properties_.Item("Name") = ShareName
InParam.Properties_.Item("Path") = FolderName
InParam.Properties_.Item("MaximumAllowed") = MAXIMUM_CONNECTIONS
InParam.Properties_.Item("Type") = 0
Share.ExecMethod_ "Create", InParam
End Sub


Function SetAccountTrustee(strDomain, strName)
Dim objTrustee
Dim account
Dim accountSID

set objTrustee = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
set account = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Account.Name='" & strName & "',Domain='" & strDomain &"'")
set accountSID = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & account.SID &"'")
objTrustee.Domain = strDomain
objTrustee.Name = strName
objTrustee.Properties_.item("SID") = accountSID.BinaryRepresentation
set accountSID = nothing
set account = nothing
set SetAccountTrustee = objTrustee
End Function


Function SetGroupTrustee(strDomain, strName)
Dim objTrustee
Dim account
Dim accountSID

set objTrustee = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
set account = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")
set accountSID = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & account.SID &"'")
objTrustee.Domain = strDomain
objTrustee.Name = strName
objTrustee.Properties_.item("SID") = accountSID.BinaryRepresentation
set accountSID = nothing
set account = nothing
set SetGroupTrustee = objTrustee
End Function

amel27
13-08-2009, 06:50
текст скрипта »зря игнорируете требование постить код в тегах [CODE], "61" - это номер строки с ошибкой - у вас это пустая строка :idontnow: ... кстати, проверил у себя на локальной машине (strComputer = ".") - скрипт прекрасно работает

Castor
13-08-2009, 15:14
61,1 - это у меня следующая строка
Set FolderSecurity = GetObject("winmgmts:Win32_LogicalFileSecuritySetting.Path='" & FolderName & "'")

Но сейчас ругается уже на 122,1
Вот на эту строку -
set account = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")

код ошибки тот же что и выше. Не знаю что думать...

amel27
13-08-2009, 16:12
- команда SET присваивает переменной указатель на объект;
- ошибка указывает, что объект не был создан/получен;
- указанные команды можно проверить отдельно:
Set FolderSecurity = GetObject("Winmgmts:Win32_LogicalFileSecuritySetting.Path='C:\WINDOWS'")
Set Account = GetObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='MyGroup',Domain='DOMAIN'")

Если ошибки нет, значит в скрипте передаются неверные параметры, если при разных заведомо корректных именах каталога/группы/домена ошибка повторяется, значит проблема в компьютере - сбой в системной компоненте WMI.

Castor
13-08-2009, 16:34
После подстановки обоих значений скрипт заработал. Спасибо. Однако тут же появился небольшой вопрос - как передать разные права на доступ для нескольких групп?

amel27
14-08-2009, 13:26
Castor, хде-то так: =)
Option Explicit
Dim objWMI, strDomain, strComputer, dicNTFS, dicShare

Const FILE_SHARE = 0
Const MAXIMUM_CONNECTIONS = 15

Const PERM_READ = 1179817
Const PERM_MODIFY = 1245631
Const PERM_FULL = 2032127
Const DOMAIN_NAME = "DOMAIN"

Set dicNTFS = CreateObject("Scripting.Dictionary")
Set dicShare = CreateObject("Scripting.Dictionary")

dicNTFS.CompareMode = vbTextCompare
dicShare.CompareMode = vbTextCompare

' Тут добавляем группы для NTFS прав

dicNTFS.Add "Group_01", PERM_READ
dicNTFS.Add "Group_02", PERM_READ

' Тут добавляем группы для прав на шару

dicShare.Add "Group_01", PERM_FULL
dicShare.Add "Group_02", PERM_FULL

' Тут вызываем функцию создания шары

CreateRemoteShare "Computer_01", "C:\TEST", "TEST", "Only Testing", dicShare, dicNTFS

' Функция создания шары

Sub CreateRemoteShare (strComp, strFolder, strShare, strInfo, dicSHARE, dicNTFS)
Dim objSecDesc, objTrustee, objACE, objWMI
Dim arrKeys, int, arrACE()
Dim objShare, objInParam, objFolderSec, intRet

Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComp & "\root\cimv2")
Set objFolderSec = objWMI.Get("Win32_LogicalFileSecuritySetting='" & strFolder & "'")
intRet = objFolderSec.GetSecurityDescriptor(objSecDesc)

arrKeys = dicNTFS.Keys
ReDim arrACE(dicNTFS.Count)

For int=0 To dicNTFS.Count-1
Set objTrustee = GetGroupTrustee(DOMAIN_NAME, arrKeys(int))
Set arrACE(int) = objWMI.Get("Win32_Ace").SpawnInstance_

arrACE(int).Properties_.Item("AccessMask") = dicNTFS.Item(arrKeys(int))
arrACE(int).Properties_.Item("AceFlags") = 3
arrACE(int).Properties_.Item("AceType") = 0
arrACE(int).Properties_.Item("Trustee") = objTrustee
Next

objSecDesc.Properties_.Item("DACL") = arrACE
intRet = objFolderSec.SetSecurityDescriptor(objSecDesc)
Set objSecDesc = objWMI.Get("Win32_SecurityDescriptor").SpawnInstance_()

arrKeys = dicSHARE.Keys
ReDim arrACE(dicSHARE.Count)

For int=0 To dicSHARE.Count-1
Set objTrustee = GetGroupTrustee(DOMAIN_NAME, arrKeys(int))
Set arrACE(int) = objWMI.Get("Win32_Ace").SpawnInstance_

arrACE(int).Properties_.Item("AccessMask") = dicSHARE.Item(arrKeys(int))
arrACE(int).Properties_.Item("ACEFlags") = 3
arrACE(int).Properties_.Item("AceType") = 0
arrACE(int).Properties_.Item("Trustee") = objTrustee
Next

objSecDesc.Properties_.Item("DACL") = arrACE

Set objShare = objWMI.Get("Win32_Share")
Set objInParam = objShare.Methods_("Create").InParameters.SpawnInstance_()

objInParam.Properties_.Item("Access") = objSecDesc
objInParam.Properties_.Item("Description") = strInfo
objInParam.Properties_.Item("Name") = strShare
objInParam.Properties_.Item("Path") = strFolder
objInParam.Properties_.Item("MaximumAllowed") = MAXIMUM_CONNECTIONS
objInParam.Properties_.Item("Type") = 0

objShare.ExecMethod_ "Create", objInParam
End Sub

' Функция получения объекта опекуна

Function GetGroupTrustee(strDomain, strName)
Dim objTrustee, objAccount, objSID, objWMI
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")

Set objTrustee = objWMI.Get("Win32_Trustee").Spawninstance_
Set objAccount = objWMI.Get("Win32_Group.Name='" & strName & "',Domain='" & DOMAIN_NAME &"'")
Set objSID = objWMI.Get("Win32_SID.SID='" & objAccount.SID &"'")

objTrustee.Domain = strDomain
objTrustee.Name = strName
objTrustee.Properties_.Item("SID") = objSID.BinaryRepresentation

Set GetGroupTrustee = objTrustee
End Function

Castor
14-08-2009, 17:48
Спасибо amel27, тему можно закрывать.

Serjione
16-10-2014, 12:56
Позвольте поднять тему. amel27, ваш скрипт под группу Everyone настроить можно ? Завершается с ошибкой на строке

set account = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")

С другми группами проблем нет.




© OSzone.net 2001-2012