【问题标题】:PowerShell: What is the best way to check whether the current user has permission to overwrite a file in PowerShell?PowerShell:检查当前用户是否有权在 PowerShell 中覆盖文件的最佳方法是什么?
【发布时间】:2014-05-21 12:26:22
【问题描述】:

TL;DR

在我的脚本开始时,我想检查一个文件(作为参数给出)是否可覆盖,如果当前用户没有权限则退出
(例如,如果用户或他/她所属的组已被拒绝访问文件。)

原因:在脚本中,我正在处理一些数据(这需要时间),最后,我将结果写入文件,但是整个脚本运行正确会有点令人沮丧,但是最后,事实证明该文件不可写(我可以在开始时检查)。


我尝试了什么

这是测试文件是否存在的正确方法

$Outfile = "w:\Temp\non-writable-file.txt"                # (normally I get this as a parameter)
$OutFileExists = Test-Path -Path $Outfile -PathType Leaf

当然,如果文件存在,$OutfileExists 将等于 True

但我想检查此文件是否可写 - 现在不是(我自己更改了安全设置以便能够对其进行测试):

所以,如果我试试这个:

(Get-Acl $Outfile).Access

我得到这个输出:

FileSystemRights  : Write
AccessControlType : Deny
IdentityReference : Everyone
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : ReadAndExecute, Synchronize
AccessControlType : Allow
IdentityReference : Everyone
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

FileSystemRights  : FullControl
AccessControlType : Allow
IdentityReference : DOESNTMATTER\Pete
IsInherited       : False
InheritanceFlags  : None
PropagationFlags  : None

(我也可以过滤这个结果。)
好的,现在我知道 Everyone 组没有写入权限。
但是我仍然不知道如何优雅地检查这个文件的可覆盖性。

【问题讨论】:

  • 如果每个人都被拒绝写入权限,那么没有人可以在不更改权限的情况下写入文件。 “拒绝条目优先于允许条目。这意味着,如果用户是两个组的成员,一个被允许授予权限,另一个被拒绝相同权限,则该用户被拒绝该权限。”
  • @bob:我知道而且我没有问为什么我不能覆盖文件(我自己更改了安全设置以便能够测试它!!),我问我如何检查(在 PowerShell 中)文件是否可写。

标签: powershell file-io powershell-4.0


【解决方案1】:

我用过这个:

Try { [io.file]::OpenWrite($outfile).close() }
 Catch { Write-Warning "Unable to write to output file $outputfile" }

它将尝试打开文件进行写访问,然后立即关闭它(实际上不向文件写入任何内容)。如果由于任何原因无法打开文件,它将运行 Catch 块,您可以在那里进行错误处理。

【讨论】:

  • 很好的答案。对于那些想知道的人,除了不向文件写入任何内容外,这也不会删除文件,也不会修改其“LastWriteTime”。
【解决方案2】:

您可以尝试快速写入(追加)到文件,例如

"" | Out-File 'w:\Temp\non-writable-file.txt' -Append

如果不存在写入权限,您将收到错误消息:

Out-File:拒绝访问路径“w:\Temp\non-writable-file.txt”。
...
+ CategoryInfo : OpenError: (:) [Out-File], UnauthorizedAccessException
+ FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

在存在写权限的情况下,您可以捕获并终止该错误 - 您刚刚在文件中添加了一个新行。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2011-05-24
    • 2011-07-24
    • 2010-09-18
    相关资源
    最近更新 更多