Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Помогите со скриптом для расшаривания (http://forum.oszone.net/showthread.php?t=147824)

Castor 12-08-2009 22:56 1192274

Помогите со скриптом для расшаривания
 
Один хороший скрипт для расшаривания папки и назначения прав (доступа и 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 1192435

Цитата:

Цитата Castor
текст скрипта »

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

Castor 13-08-2009 15:14 1192794

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 1192837

- команда 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 1192855

После подстановки обоих значений скрипт заработал. Спасибо. Однако тут же появился небольшой вопрос - как передать разные права на доступ для нескольких групп?

amel27 14-08-2009 13:26 1193502

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 1193677

Спасибо amel27, тему можно закрывать.

Serjione 16-10-2014 12:56 2416165

Позвольте поднять тему. amel27, ваш скрипт под группу Everyone настроить можно ? Завершается с ошибкой на строке

Код:

set account = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Group.Name='" & strName & "',Domain='" & strDomain &"'")
С другми группами проблем нет.


Время: 13:41.

Время: 13:41.
© OSzone.net 2001-