3

我正在尝试编写一个强大的 shell 程序/例程,它在 txt 文件的末尾添加两个新行,并且还做很多其他的事情。

由于缺少对文件的写入权限,我想防止文件写入尝试失败。所以我想测试当前用户是否对特定文件有写权限。

我试试

$Files = "C:\Program Files\MySoftware\SWVersion\OtherSubFolder\DesiredFile.txt"
Get-Acl -Path $Files | Format-List AccessToString

但这会显示所有用户对文件的权限,但我只想知道当前用户是否可以写入所需的文件。

任何帮助或指导将不胜感激。

谢谢。

4

2 回答 2

5

如果您只想过滤当前用户的AccessToString属性的结果,那么假设每一行都以DOMAIN\username格式的用户开头,那么您需要做的就是:

(Get-Acl $File).AccessToString | findstr "$env:USERDOMAIN\$env:USERNAME"

如果您想获取FileSystemAccessRule对象以便您可以使用它做一些事情,请这样做:

(Get-Acl $File).Access | ?{$_.IdentityReference -eq "$env:USERDOMAIN\$env:USERNAME"}

如果您想检查用户是否具有某些权限,这可能更有用:

if (((Get-Acl $File).Access | ?{$_.IdentityReference -eq "$env:USERDOMAIN\$env:USERNAME"}).FileSystemRights -match 'Modify') {
  # Do whatever it is you want to do if the user has Modify permissions
}

(当然,您可以应用-match 'Modify'到第一个命令的结果,这通常不会有问题,但如果域或用户名包含“修改”,它会中断。不太可能,但最好只匹配属性你有兴趣。)

注意:我将$Files更改为$File是因为您只为单个文件分配了路径。如果$Files旨在成为多个文件的路径数组,请将其通过管道传递到Foreach-Object块,如下所示:

$Files | %{(Get-Acl $_).Access | ?{$_.IdentityReference -eq "$env:USERDOMAIN\$env:USERNAME"}
于 2013-10-23T04:45:03.107 回答
1

您可以采取更直接的方法:

$Files = "C:\Program Files\MySoftware\SWVersion\OtherSubFolder\DesiredFile.txt"

try { 
     $filetest =  [IO.FILE]::OpenWrite($Files)
     $filetest.close()
   }
catch { "Unable to open file for write: $($Files.fullname) `n`n $($Error[0])"}
于 2013-10-23T10:33:11.013 回答