UnauthorizedAccessException设置目录安全性

时间:2012-10-15 03:20:50

标签: .net

我有一个应用程序,我希望用户能够在其主目录中执行SQL / Server备份。由于SQL在网络服务帐户下运行,因此在尝试备份时会出现文件系统权限错误。我尝试了以下代码和一些变体来尝试完全控制网络帐户:

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

Hower我在调用FolderInfo.SetAccessControl时遇到System.UnauthorizedAccessException异常。我还尝试了非Windows路径上的代码,用户可以完全控制并获得相同的结果。任何想法都赞赏,我目前正在Windows 7和.NET Framework 4下进行测试。

1 个答案:

答案 0 :(得分:0)

非常感谢OwerFlov提出的建议,即使用户拥有该文件夹的权限,设置文件夹的权限也需要提升,事实证明确实如此。对于特定的应用程序,我决定使用具有适当权限的InstallShield创建备份目录,然后将SQL / Server备份文件复制到最终目标。我使用压缩,所以无论如何都需要额外的文件访问。

我有机会进一步研究,发现更改特定文件的访问权限不需要提升。对于任何类似的未来要求,我编写了以下代码,用于创建一个空文件,并授予网络服务帐户完全控制权限:

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将使用备份集成功覆盖空文件。