我有一个应用程序,我希望用户能够在其主目录中执行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下进行测试。
答案 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将使用备份集成功覆盖空文件。