gpt4 book ai didi

powershell - 在 Windows 文件共享上设置权限

转载 作者:行者123 更新时间:2023-12-03 09:35:33 27 4
gpt4 key购买 nike

我有以下代码,它应该通过文件共享中的文件夹并将那里的任何权限转换为读取权限。但是,有一个问题:它不会替换已经存在的权限,它只是添加到它们中。其次,如果文件夹没有获得继承权限,它会给出一个错误说

Set-Acl : The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation.



我已经检查了权限并且我可以完全控制它们
function NotMigrated($SiteURL, $Folder) {
try {
$SiteString=[String]$SiteURL
$pos = $SiteString.LastIndexOf("/")
$Site = $SiteString.Substring($pos+1)
$parent=((get-item $Folder ).parent).Fullname

$AllFolders = Get-ChildItem -Recurse -Path $Folder |? {$_.psIsContainer -eq $True}
$FilesInRoot = Get-ChildItem -Path $Folder | ? {$_.psIsContainer -eq $False}
$acl= get-acl $Folder
foreach ($usr in $acl.access) {
$acl.RemoveAccessRule($usr)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($usr.IdentityReference,"Read","none","none","Allow")
$Acl.AddAccessRule($rule)
}
$acl | Set-Acl
} catch { continue }

#Loop through all folders (recursive) that exist within the folder supplied by the operator
foreach ($CurrentFolder in $AllFolders) {
#Set the FolderRelativePath by removing the path of the folder supplied by the operator from the fullname of the folder
$FolderRelativePath = ($CurrentFolder.FullName).Substring($Folder.Length)
$FileSource = $Folder + $FolderRelativePath

try {
$acl= get-acl $FileSource
foreach ($usr in $acl.access) {
$acl.RemoveAccessRule($usr)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule($usr.IdentityReference,"Read","none","none","Allow")
$acl.AddAccessRule($rule)
}
$acl | Set-Acl
} catch { continue }

#For each file in the source folder being evaluated, call the UploadFile function to upload the file to the appropriate location
}
}

最佳答案

最大的问题不在于您的代码,而在于 Set-Acl Cmdlet/FileSystem provider combination .调用 Set-Acl 时,将尝试写入整个安全描述符。如果您没有被提升(或者如果您的管理员帐户没有被授予 SeRestorePrivilege),这将不起作用。但是,如果您被提升,则有可能是 destroying your SACL在您正在修改的文件/文件夹上。

出于这个原因,我会不惜一切代价避免使用 Set-Acl,直到我在上面链接到的错误得到修复。相反,您可以使用可用于文件和文件夹对象的 SetAccessControl() 方法:

(Get-Item c:\path\to\folder).SetAccessControl()

一旦你这样做了,你就不应该再看到 SeSecurityPrivilege 错误了。但是,您仍然会遇到这两个问题:
  • 您希望为文件夹中包含的所有 ACE 创建一个新的 ACE。我认为您想要做的是寻找未被继承的“允许”ACE。如果您有任何“拒绝”ACE,您最终将获得授予“读取”访问权限的新“允许”ACE,我敢打赌您不想这样做。此外,如果您包含继承的 ACE,您将最终为每个 ACE 提供一个新的显式 ACE,并且您无法删除继承的 ACE,除非您破坏继承...
  • 您没有复制现有的继承和传播标志,也没有使用文件夹的默认值。

  • 我认为这段代码的修改版本应该可以满足您的需求:
    try {
    $acl = get-acl $FileSource

    # Only look for explicit Allow ACEs
    foreach ($usr in ($acl.access | where { $_.IsInherited -eq $false -and $_.AccessControlType -eq 'Allow' })) {
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    $usr.IdentityReference,
    "Read",
    $usr.InheritanceFlags,
    $usr.PropagationFlags,
    $usr.AccessControlType
    )

    # Calling SetAccessRule() is like calling Remove() then Add()
    $acl.SetAccessRule($rule)
    }
    (Get-Item $FileSource).SetAccessControl($acl)
    } catch { continue }

    关于powershell - 在 Windows 文件共享上设置权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31611103/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com