|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Помогите со скриптом для расшаривания |
|
VBS/WSH/JS - [решено] Помогите со скриптом для расшаривания
|
Новый участник Сообщения: 15 |
Один хороший скрипт для расшаривания папки и назначения прав (доступа и 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
|
Профиль | Отправить PM | Цитировать Цитата Castor:
![]() |
|
Отправлено: 06:50, 13-08-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 15
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать - команда SET присваивает переменной указатель на объект;
- ошибка указывает, что объект не был создан/получен; - указанные команды можно проверить отдельно: Если ошибки нет, значит в скрипте передаются неверные параметры, если при разных заведомо корректных именах каталога/группы/домена ошибка повторяется, значит проблема в компьютере - сбой в системной компоненте WMI. |
Отправлено: 16:12, 13-08-2009 | #4 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать После подстановки обоих значений скрипт заработал. Спасибо. Однако тут же появился небольшой вопрос - как передать разные права на доступ для нескольких групп?
|
|
Отправлено: 16:34, 13-08-2009 | #5 |
Googler Сообщения: 3665
|
Профиль | Отправить 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
|
Профиль | Отправить PM | Цитировать Спасибо amel27, тему можно закрывать.
|
Отправлено: 17:48, 14-08-2009 | #7 |
Старожил Сообщения: 203
|
Профиль | Отправить PM | Цитировать |
Последний раз редактировалось Serjione, 16-10-2014 в 13:42. Отправлено: 12:56, 16-10-2014 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|