2

ローカル システム アカウントとして実行される Windows サービスを作成しています。ファイルへの完全な読み取り/書き込みアクセス権があるかどうかを確認して、さらに処理を開始しようとしています。これが私のコードです:

    Dim FullPath As String
    FullPath = "C:\directory\file.txt"
    Dim ps As Security.PermissionSet
    ps = New Security.PermissionSet(Security.Permissions.PermissionState.Unrestricted)
    ps.AddPermission(New Security.Permissions.FileIOPermission(Security.Permissions.FileIOPermissionAccess.AllAccess, FullPath))
    ps.AddPermission(New Security.Permissions.FileIOPermission(Security.Permissions.FileIOPermissionAccess.AllAccess, IO.Path.GetDirectoryName(FullPath)))
    Try
        ps.Demand()
    Catch ex As Security.SecurityException
        System.Diagnostics.EventLog.WriteEntry("ShopLink", "File " + FullPath + " will not be parsed. " + ex.Message)
        Exit Sub
    Catch ex As Exception
        System.Diagnostics.EventLog.WriteEntry("ShopLink", "File " + FullPath + " will not be parsed. " + ex.Message)
        Exit Sub
    End Try

次に、サービスを実行しているユーザー アカウントに対して、ファイルのフル アクセス許可を「拒否」に設定します。実行後、上記のコードは例外をスローせず、ファイル処理を開始できるようにします。サービスが後でファイルを変更または削除しようとすると、「アクセスが拒否されました」という例外が発生します。

助言がありますか?

4

3 に答える 3

1

Kill の代わりに My.Computer.FileSystem.DeleteFile を使用してファイルを削除することで問題を解決しました。My.Computer.FileSystem.DeleteFile は、上記の方法でファイルへの完全な読み取り/書き込みアクセスを正常に要求した後、問題なく実行されましたが、Kill は一貫して「アクセスが拒否されました」例外をスローしました。

于 2013-08-14T23:48:54.597 に答える
0

「Kill​​」を使用しています...これは非常に古いスレッドであることは知っていますが、私のように誰かがつまずいた場合に備えて追加します。私はいくつかの古い VB6 レガシー コードに取り組んでいました。私のクライアント ユーザーの 1 人が、強制終了後にファイルを開くときに実行時例外を取得していました。コードはファイルを「強制終了」し、メモリに保持されているバイナリ データを使用してファイルを最初から再構築していました。「Kill​​」機能がユーザーのウイルス対策ソフトウェアをトリガーし、次の「Open」ステートメントが失敗するのに十分な時間ファイルをロックしたことがわかりました。エラーログユーティリティを使用してこれを発見しました(現時点では名前がわかりません)。失敗した "Open" ステートメントのエラー ログ ファイルの行は、ユーザーのウイルス対策ソフトウェアが原因で、ファイルのステータスが "削除保留中" であったことを示していました。

于 2016-11-23T12:12:56.950 に答える