Я конвертирую свой код для использования icacls
и в настоящее время следую этому уроку: https://ss64.com/nt/icacls.html.
В этой части,
Предоставьте пользователю права jdoeдля создания, редактирования и удаления файлов в папке C: \ demo \ example \, но для предотвращения удаления самой папки:
:: Сначала удалите наследование и предоставьте администраторам полный доступ к верхней папке icacls "C:\ demo \ example "/ наследование: r / grant: r администраторы: (OI) (CI) (F)
:: Grant Modify + Удалить дочерний элемент для подпапок и файлов только 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)
:: если есть какие-либо ранее существовавшие подпапки Grant admins Полный контроль icacls" C: \ demo \ example "/ grant:r администраторы: (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
ОБНОВЛЕНИЕ:
С здесь , я нашел около
Только подпапки и файлы (OI) (CI)(NP) (IO)
, что совпадает с тем, что хочет сделать 2-я инструкция, поэтому я попытался ее использовать.Сначала он ничего не делает, но после нескольких, примерно 6 раз, компиляции с * 1039 и без него, учетная запись пользователя получает полное разрешение, даже если я не изменил разрешения для кода, все еще (M,DC)
.
В настоящее время моя структура папок выглядит следующим образом.
test_folder
|- test_test_file
|- test_test_folder
|- test_test_test_folder
|- test_test_test_file
Для папок test_folder администратор и пользователь оба имеют полное разрешение.В этой подпапке есть Администратор и Пользователь, но оба не имеют разрешения, проверенного в нем.