.net UnauthorizedAccessException设置目录安全性

.net UnauthorizedAccessException设置目录安全性,.net,.net,我有一个应用程序,我希望用户能够执行到其主目录的SQL/Server备份。由于SQL是在网络服务帐户下运行的,因此在尝试备份时会出现文件系统权限错误。我尝试了以下代码和一些变体,试图完全控制网络帐户: Public Sub GiveFolderNetworkAccess(FilePath As String) Dim SID As SecurityIdentifier = New SecurityIdentifier(WellKnownSidType.NetworkServiceSid,

我有一个应用程序,我希望用户能够执行到其主目录的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

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

非常感谢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测试将成功地用备份集覆盖一个空文件。

也许您需要请求UAC提升。