1

我有一个应用程序,我希望用户能够将 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 下进行测试。

4

1 回答 1

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

于 2012-12-10T05:12:59.887 回答