1

ユーザーがホーム ディレクトリに SQL/Server バックアップを実行できるようにしたいアプリケーションがあります。SQL は Network Service アカウントで実行されているため、バックアップを試みるとファイル システムのアクセス許可エラーが発生します。次のコードといくつかのバリエーションを試して、ネットワーク アカウントを完全に制御できるようにしました。

Public Sub GiveFolderNetworkAccess(FilePath As String)
    Dim SID As SecurityIdentifier = New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing)
    Dim FolderInfo As IO.DirectoryInfo = New IO.DirectoryInfo(FilePath)
    Dim FolderAcl As New DirectorySecurity
    FolderAcl.AddAccessRule(New FileSystemAccessRule(SID, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow))
    FolderInfo.SetAccessControl(FolderAcl) 
End Sub

FolderInfo.SetAccessControl を呼び出すと、System.UnauthorizedAccessException 例外が発生します。また、ユーザーが完全に制御できる Windows 以外のパスでコードを試してみましたが、同じ結果が得られました。任意のアイデアを歓迎します。現在、Windows 7 および .NET Framework 4 でこれをテストしています。

4

1 に答える 1

0

ユーザーがフォルダーに対するアクセス許可を持っていても、フォルダーにアクセス許可を設定するには昇格が必要であるという提案をしてくれた OwerFlov に感謝します。特定のアプリケーションについて、InstallShield を使用して適切な権限でバックアップ ディレクトリを作成し、SQL/Server バックアップ ファイルを最終的な宛先にコピーすることにしました。とにかく余分なファイルアクセスが必要だったので、圧縮を使用しました。

それ以来、さらに調査する機会があり、特定のファイルへのアクセスを変更するのに昇格は必要ないことがわかりました。同様の将来の要件のために、Network Service アカウントに付与されたフル コントロール権限を持つ空のファイルを作成する次のコードを作成しました。

Public Sub CreateFileWithNetworkAccess(fileName As String)
    File.Create(fileName).Dispose()
    Dim SID As SecurityIdentifier = New SecurityIdentifier(WellKnownSidType.NetworkServiceSid, Nothing)
    Dim fSecurity As FileSecurity = File.GetAccessControl(fileName)
    Dim accessRule As FileSystemAccessRule = New FileSystemAccessRule(SID, FileSystemRights.FullControl, AccessControlType.Allow)
    fSecurity.AddAccessRule(accessRule)
    File.SetAccessControl(fileName, fSecurity)
End Sub

SQL/Server をいくつかテストすると、空のファイルがバックアップ セットで正常に上書きされます。

于 2012-12-10T05:12:59.887 に答える