如何确定当前Windows用户是否使用power shell对特定文件进行了写入权限

Tra*_*ito 3 windows powershell automation

我正在尝试编写一个电源shell程序/例程,它在txt文件的末尾添加两个新行,还可以执行许多其他操作.

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

我试试

$Files = "C:\Program Files\MySoftware\SWVersion\OtherSubFolder\DesiredFile.txt"
Get-Acl -Path $Files | Format-List AccessToString
Run Code Online (Sandbox Code Playgroud)

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

任何帮助或指导都会被贬低.

谢谢.

Adi*_*bar 5

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

(Get-Acl $File).AccessToString | findstr "$env:USERDOMAIN\$env:USERNAME"
Run Code Online (Sandbox Code Playgroud)

如果要获取FileSystemAccessRule对象以便可以对其执行某些操作,请执行以下操作:

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

(当然,你可以申请-match 'Modify'第一个命令的结果,这通常不会有问题,但如果域或用户名包含"修改",它会破坏.不太可能,但最好只是匹配属性你有兴趣.)

注:我改变$文件$文件,因为你只分配到一个单一的文件的路径.如果$ Files旨在成为多个文件的路径数组,请将其传递给Foreach-Object块,如下所示:

$Files | %{(Get-Acl $_).Access | ?{$_.IdentityReference -eq "$env:USERDOMAIN\$env:USERNAME"}
Run Code Online (Sandbox Code Playgroud)

  • `[Enum] :: GetNames([System.Security.AccessControl.FileSystemRights])`将为您提供可能的**FileSystemRights**值的完整列表. (2认同)
  • 在某些情况下,您建议的解决方案不能给我正确的答案.当用户拥有对所请求文件的权限时,此方法会给我一个"错误"的答案,但是以隐式方式.例如,当当前用户被关联到特定用户组,并且该组对文件具有写访问,完全控制等,但是对于用户访问没有直接(以单独方式)指定文件(或文件夹).你知道怎么处理吗? (2认同)