【问题标题】:Setting System to have permission to write to a folder via powershell将系统设置为有权通过 powershell 写入文件夹
【发布时间】:2014-10-27 13:04:01
【问题描述】:

我有一个特定文件夹 (C:\Windows\winsxs\amd64_microsoft-windows-wpd-portabledeviceapi_31bf3856ad364e35_6.1.7601.17514_none_a926cbb502a97a6e),我需要能够通过 powershell 脚本更改其权限。

我需要能够让系统能够在此文件夹中创建文件。

当我检查 Get-Acl 命令时,它显示 NT Authority\System 已经是文件夹的所有者了?通过 Set-ACL 运行以使该系统帐户能够创建文件的最佳命令是什么?

提前致谢。

(到目前为止,我已经尝试过这段代码......但我的访问被拒绝)

$folder = "C:\Windows\winsxs\amd64_microsoft-windows-wpd-portabledeviceapi_31bf3856ad364e35_6.1.7601.17514_none_a926cbb502a97a6e"
$myUser = "NT AUTHORITY\SYSTEM"
$acl = Get-Acl $folder
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$myUser", "ReadData", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$myUser", "CreateFiles", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$myUser", "AppendData", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
Set-Acl $folder $acl

Set-Acl : Attempted to perform an unauthorized operation.
At line:10 char:1
+ Set-Acl $folder $acl
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : PermissionDenied: (C:\Windows\wins...926cbb502a97a6e:String) [Set-Acl], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetAclCommand

【问题讨论】:

  • 你是从提升的提示符下运行这个吗?
  • 我从提升的提示符下运行它。如果我只想允许访问 Winsxs 中的特定文件夹以允许系统创建文件(不删除等),我需要编写什么脚本?我最好只在文件夹上使用 takeown 然后在上面运行我的脚本吗?

标签: powershell acl


【解决方案1】:

C:\Windows\winsxs 是 Windows 组件存储。篡改里面的任何东西时要非常、非常小心。

您收到“拒绝访问”的原因很可能是因为组件存储由 NT Authority\TrustedInstaller 安全主体所有。管理员甚至 SYSTEM 在那里只有读/执行权限。如果您希望能够修改其中一个子文件夹的权限,您需要首先获得 winsxs 文件夹的所有权并授予管理员完全访问权限。

在完成所做的任何更改后,请特别注意将所有权归还给 NT Authority\TrustedInstaller(并恢复在取得所有权时可能已被删除的权限)。

这样的东西应该可以工作(但未经测试,因此请谨慎处理):

$fldr = 'C:\Windows\winsxs'

# get backup copy of folder ACL
$aclBackup = Get-Acl $fldr

try {
  # take ownership 
  $acl = Get-Acl $fldr
  $admins = New-Object Security.Principal.NTAccount('Builtin', 'Administrators')
  $acl.SetOwner($admins)
  Set-Acl -AclObject $acl -Path $fldr

  # not certain if taking ownership and adding permissions in one step works,
  # thus using two steps
  $acl = Get-Acl $fldr
  $ace = New-Object Security.AccessControl.FileSystemAccessRule('Builtin\Administrators', 'FullControl', 'ContainerInherit, ObjectInherit', 'InheritOnly', 'Allow')
  $acl.AddAccessRule($ace)
  Set-Acl -AclObject $acl -Path $fldr

  # change permissions of subfolder
  $sf = "$fldr\amd64_microsoft-windows-..."
  $acl = Get-Acl $sf
  $ace = New-Object Security.AccessControl.FileSystemAccessRule('NT Authority\SYSTEM', 'FullControl', 'ContainerInherit, ObjectInherit', 'InheritOnly', 'Allow')
  $acl.AddAccessRule($ace)
  Set-Acl -AclObject $acl -Path $sf

  # ...
  # more stuff
  # ...
} finally {
  # always restore original ACL on winsxs folder (error or not)
  Set-Acl -AclObject $aclBackup -Path $fldr
}

【讨论】:

  • 它在 Set-Acl -AclObject $acl -Path $fldr 步骤中失败,并带有相同的确切消息,即 Set-Acl : Attempted to perform an unauthorized operation。在以管理员身份在提升模式下运行 powershell 时,有什么方法可以将trustedinstaller 拥有的文件/文件夹的所有权更改为管理员?
猜你喜欢
  • 2018-08-09
  • 2019-04-03
  • 2023-03-28
  • 2023-03-21
  • 2013-02-07
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多