完全重复: 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;
}
答案 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运行时具有执行该文件操作的权限。