在远程文件/目录上设置ACL时的未授权操作

时间:2010-01-10 13:23:17

标签: c# filesystems

完全重复: https://stackoverflow.com/posts/2035107

尝试删除文件并在远程位置保存操作。 当作为控制台应用程序运行时,它工作正常但从XP_CMDSHELL(SQL服务器)调用时失败 以下是从XP_CMDShell

运行时的异常
[4804] System.UnauthorizedAccessException: Attempted to perform an unauthorized operation. 

[4804]在System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType,String name,SafeHandle handle,AccessControlSections accessControlSections,RawSecurityDescriptor& resultSd) [4804]在System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType,Boolean isContainer,String name,SafeHandle handle,AccessControlSections includeSections,Boolean createByName,ExceptionFromErrorCode exceptionFromErrorCode,Object exceptionContext) [4804]在System.Security.AccessControl.FileSystemSecurity..ctor(Boolean isContainer,String name,AccessControlSections includeSections,Boolean isDirectory) [4804]在System.Security.AccessControl.DirectorySecurity..ctor(String name,AccessControlSections includeSections) [4804]在System.IO.DirectoryInfo.GetAccessControl(AccessControlSections includeSections) [4804]在D:\ SAABZX01D \ dev \ libraries \ EXCEL \ Class1.cs中的Excel.SetAcl(字符串文件名,字符串帐户):第228行 [4804]在D:\ SAABZX01D \ dev \ libraries \ EXCEL \ Class1.cs中的Excel.doKEStats(String baanId,String fromDate,String toDate):第87行

这是代码

 public static  bool SetAcl(string filename,string account)
    {
        FileSystemAccessRule rule = new FileSystemAccessRule(account, FileSystemRights.FullControl, AccessControlType.Allow);
         string path= System.IO.Directory.GetDirectoryRoot(filename);
      System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(filename);


      bool what = false;
      DirectorySecurity security = di.GetAccessControl(AccessControlSections.Access);
      security.ModifyAccessRule(AccessControlModification.Add, rule, out what);




      di.SetAccessControl(security);
      return what;

    }

2 个答案:

答案 0 :(得分:1)

问题是DirectoryInfo以完整路径(包括文件名)呈现。 以下是修改后的代码。

 public static bool SetAcl(string filename, string account)
{
    FileSystemAccessRule rule = new FileSystemAccessRule(account, FileSystemRights.Write, AccessControlType.Allow);

    PermissionSet fp = new PermissionSet(PermissionState.Unrestricted);
    fp.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, new string[] { filename }));
    fp.AddPermission(new FileIOPermission(FileIOPermissionAccess.Write | FileIOPermissionAccess.PathDiscovery, new string[] { filename }));
    fp.Assert();

    System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(System.IO.Path.GetDirectoryName(filename));


    bool what = false;
    DirectorySecurity security = di.GetAccessControl();

    security.ModifyAccessRule(AccessControlModification.Add, rule, out what);
    di.SetAccessControl(security);
    return what;

}

答案 1 :(得分:0)

确保帐户SQL Server运行时具有执行该文件操作的权限。