Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите со скриптом для расшаривания

Ответить
Настройки темы
VBS/WSH/JS - [решено] Помогите со скриптом для расшаривания

Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Castor
Дата: 13-08-2009
Описание: улучшение читабельности
Один хороший скрипт для расшаривания папки и назначения прав (доступа и 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

Отправлено: 22:56, 12-08-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:50, 13-08-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


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 &"'")

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

Отправлено: 15:14, 13-08-2009 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


- команда 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.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:12, 13-08-2009 | #4


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:34, 13-08-2009 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:26, 14-08-2009 | #6


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:48, 14-08-2009 | #7


Старожил


Сообщения: 203
Благодарности: 3

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось Serjione, 16-10-2014 в 13:42.


Отправлено: 12:56, 16-10-2014 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите со скриптом для расшаривания

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Помогите со скриптом Bullet-Avalon Скриптовые языки администрирования Windows 5 04-08-2009 11:45
[решено] Помогите со скриптом для окна InputBox и нажатиями мышкой(см.внутри) sashadeg AutoIt 2 23-02-2009 20:12
[решено] Помогите со скриптом копиравания ?? Ufo_log Программирование в *nix 9 20-12-2007 16:43
[решено] Помогите со скриптом shoot Microsoft Windows 2000/XP 4 06-09-2006 11:43
Помогите со скриптом для поиска файла. vlazari Microsoft Windows 2000/XP 2 27-06-2006 14:39




 
Переход