Я конвертирую свой код для использования icacls
и в настоящее время следую этому руководству: https://ss64.com/nt/icacls.html.
В этой части
Предоставьте пользователю jdoe права на создание, редактирование и удаление файлов в папке C: \ demo \ example \, но запретите удаление самой папки:
:: Сначала удалите наследование и предоставьте администраторам полный доступ к верхней папке icacls «C: \ demo \ example» / наследование: r / grant: r administrators: (OI) (CI) (F)
:: Grant Modify + Delete Child только для вложенных папок и файлов icacls "C: \ demo \ example" / grant: r ss64Dom \ jdoe: (OI) (CI) (IO) (M, DC) / T
:: Предоставить чтение / выполнение, запись и добавление в папку верхнего уровня icacls "C: \ demo \ example" / grant: r ss64Dom \ jdoe: (RX, WD, AD)
:: если есть какие-либо ранее существовавшие подпапки. Предоставить администраторам полный контроль над icacls "C: \ demo \ example" / grant: r administrators: (OI) (CI) (F) / T
, Я смог получить правильные результаты для первой инструкции, но вторая у меня не работает. Я пытался изменить M,DC
расставаться с F
но это тоже не работает.
Это мой код.
Option Explicit
On Error Resume Next
Dim objShell,objFSO, ProgramFiles, X, Y, intRunError, strFolders,strFiles, strNTGroup
Dim strFolder, strFile, strUserName, strEveryone, strDomain
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
strFolders = Array(_
"C:\Users\User\Documents\test_folder3",_
"C:\Users\User\Documents\test_folder2",_
"C:\Users\User\Documents\test_folder")
strFiles = Array(_
"C:\Users\User\Documents\test_file.txt",_
"C:\Users\User\Documents\test_file2.txt")
'User's User Name
strDomain = "Domain"
strUserName = strDomain & "\User"
strEveryone = "Everyone"
WScript.Echo "Set permissions for", strUserName, vbCRLF
'Assign User Permissions to Folders.
For X = 0 to Ubound(strFolders)
strFolder = strFolders(X)
If objFSO.FolderExists(strFolder) Then
WScript.Echo "Folder: " & strFolder
'intRunError = objShell.Run("%COMSPEC% /c Echo Y| cacls " & strFolder & " /E /C /G " & strUserName & ":F", 2, True)
objShell.Run "icacls " & strFolder & " /inheritance:r /grant:r administrators:(OI)(CI)(F)", 2, True
intRunError = objShell.Run("icacls " & strFolder & " /grant:r " & strUserName & ":(OI)(CI)(IO)(M,DC) /T", 2, True)
If intRunError <> 0 Then
Wscript.Echo "Folder ErrCode: " & intRunError
Wscript.Echo "Error assigning permissions for user " _
& strNTGroup & " to folder " & strFolder
End If
Else
WScript.Echo "Folder " & strFolder & " not found"
End If
Next
Кстати, я запускаю его на своем локальном ПК с Windows 7.
Так выглядит мой текущий код.
Option Explicit
On Error Resume Next
Dim objShell,objFSO, ProgramFiles, X, Y, intRunError, strFolders,strFiles, strNTGroup
Dim strFolder, strFile, strUserName, strUName, strEveryone, strDomain, intRunError2, intRunError3
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Wscript.Shell")
strFolders = Array(_
"C:\Users\User\Documents\test_folder3",_
"C:\Users\User\Documents\test_folder2",_
"C:\Users\User\Documents\test_folder")
strFiles = Array(_
"C:\Users\User\Documents\test_file.txt",_
"C:\Users\User\Documents\test_file2.txt")
'User's User Name
strDomain = objShell.ExpandEnvironmentStrings( "%USERDOMAIN%" )
strUserName = objShell.ExpandEnvironmentStrings( "%USERNAME%" )
strUName = strDomain & "\User"
strEveryone = "Everyone"
WScript.Echo "Set permissions for", strUName, vbCRLF
'Assign User Permissions to Folders.
For X = 0 to Ubound(strFolders)
strFolder = strFolders(X)
If objFSO.FolderExists(strFolder) Then
WScript.Echo "Folder: " & strFolder
intRunError = objShell.Run("icacls " & strFolder & " /inheritance:r /grant:r administrators:(OI)(CI)(F)", 2, True)
If intRunError <> 0 Then 'If no error, proceed
Wscript.Echo "Folder Error1: ", intRunError
Wscript.Echo "Error assigning admin permissions for user " _
& strUName & " to folder " & strFolder
Else
Set intRunError2 = objShell.Exec("icacls " & strFolder & " /grant:r " & strUName & ":(OI)(CI)(NP)(IO)(M,DC) /T", 2, True)
Wscript.Echo "Exit code: " & intRunError2
Wscript.Echo "ErrMsg: " & intRunError2.StdErr.ReadAll
If intRunError3 <> 0 Then
Wscript.Echo "Folder Error3: " & intRunError2
Wscript.Echo "Error assigning permissions for user " _
& strUName & " to folder " & strFolder
Wscript.Echo "Exit code: " & intRunError2
Wscript.Echo "ErrMsg: " & intRunError2.StdErr.ReadAll
End If
End If
Else
WScript.Echo "Folder " & strFolder & " not found"
End If
WScript.Echo "-------------------"
Next
Wscript.Echo "Done setting folder permissions", vbCRLF
Set objFSO = Nothing
Set objShell = Nothing
WScript.Quit
Первый objShell.Run
работает. О следующих objShell.Exec
, ошибок не появляется, но и ничего не происходит.