web-dev-qa-db-ja.com

PowerShell:現在のユーザーがPowerShellでファイルを上書きする権限を持っているかどうかを確認する最良の方法は何ですか?

TL; DR

スクリプトの冒頭で、ファイル(パラメーターとして指定)が上書き可能かどうかを確認し、現在のユーザーに上書き可能な権限がない場合は終了します
(たとえば、ユーザーまたはそのユーザーが属するグループがファイルへのアクセスを拒否された場合。)

理由:スクリプトでいくつかのデータを処理していて(時間がかかります)、最後に結果をファイルに書き込みますが、スクリプト全体が正しく実行されたのは少しイライラしますが、最後に、ファイルが書き込み可能ではないことが判明しました(最初に確認できたはずです)。


私が試したこと

これは、fileが存在するかどうかをテストする正しい方法です

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

もちろん、ファイルが存在する場合、$OutfileExistsTrueと等しくなります。

しかし、このファイルが書き込み可能かどうかを確認したいと思います-現在は書き込み可能ではありません(テストできるようにセキュリティ設定を自分で変更しました):

Everyone - denied from writing

だから、私がこれを試してみると:

(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

(この結果をフィルタリングすることもできます。)
OK、Everyoneグループには書き込みアクセス権がないことがわかりました。
しかし、このファイルの上書き可能性をエレガントにチェックする方法はまだわかりません。

11
Sk8erPeter

私はこれを使用しました:

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

書き込みアクセスのためにファイルを開こうとし、すぐに閉じます(実際にはファイルに何も書き込みません)。何らかの理由でファイルを開くことができない場合は、Catchブロックが実行され、そこでエラー処理を行うことができます。

20
mjolinor

次のようなファイルへのクイック書き込み(追加)を試みることができます。

"" | 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

書き込み権限が存在する場合は、そのエラーをキャッチして終了することができます。ファイルに新しい行を追加しただけです。

1
bob