Got System.InvalidOperationException:方法失败,出现意外的错误代码64

问题描述:

我正在努力获取文件夹的权限,然后在C#控制台应用程序中访问,文件夹的路径可能是ftp本地.Same正在我的机器上工作,但在生产中部署时服务器其开始投掷错误System.InvalidOperationException: Method failed with unexpected error code 64Got System.InvalidOperationException:方法失败,出现意外的错误代码64

确切的错误接收代码

System.InvalidOperationException: Method failed with unexpected error code 64. 
at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext) 
at System.Security.AccessControl.FileSystemSecurity..ctor(Boolean isContainer, String name, AccessControlSections includeSections, Boolean isDirectory) 
at System.Security.AccessControl.DirectorySecurity..ctor(String name, AccessControlSections includeSections) 
at UploadData.FolderManager.IsConfiguredFolderAccessible(String path, Folder folder) 

完整的代码抛出的错误是

private static void IsConfiguredFolderAccessible(string path, Folder folder) 
    { 
     // If the file can be opened for exclusive access it means that the file 
     // is no longer locked by another process. 
     try 
     { 
      if (!Directory.Exists(path)) 
      { 
       LogHelper.Log(string.Format("Folder does not exist on given path {0}. Please re-create folder, grant permission and re-start the UPC utility. ", folder.Path), LogHelper.LogLevel.Error); 
       MailComponent.SendMail(string.Format("Folder does not exist on given path {0}. Please re-create folder, grant permission and re-start the UPC utility.", folder.Path), "Folder does not exist"); 
       return; 
      } 
      else 
      { 
       var accessControlList = Directory.GetAccessControl(path); 

       if (accessControlList == null) 
       { 
        LogHelper.Log(string.Format("AccessControlList on Folder {0} are not defined", folder.ToString()), LogHelper.LogLevel.Error); 
        MailComponent.SendMail(folder.ToString(), "AccessControlList on Folder are not defined"); 
       } 
       var accessRules = accessControlList.GetAccessRules(true, true, 
              typeof(System.Security.Principal.SecurityIdentifier)); 

       if (accessRules == null) 
       { 
        LogHelper.Log(string.Format("AccessRules on Folder {0} are not defined", folder.ToString()), LogHelper.LogLevel.Error); 
        MailComponent.SendMail(folder.ToString(), "AccessRules on Folder are not defined"); 
       } 
       foreach (FileSystemAccessRule rule in accessRules) 
       { 
        if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) 
         continue; 

        if (rule.AccessControlType == AccessControlType.Deny) 
        { 
         LogHelper.Log(string.Format("Access permission denied on Folder {0}", path), LogHelper.LogLevel.Error); 
         MailComponent.SendMail(folder.ToString(), string.Format("Access permission denied on Folder {0}", path)); 
        } 
       } 
      } 
     } 
     catch (PrivilegeNotHeldException pv) 
     { 
      LogHelper.Log(string.Format("Access permission denied on Folder {0}, Error detail : {1}", path, pv.ToString()), LogHelper.LogLevel.Error); 
      MailComponent.SendMail(pv.ToString(), string.Format("Access permission denied on Folder {0}", path)); 
      throw pv; 
     } 
     catch (IOException io) 
     { 
      LogHelper.Log(string.Format("Folder does not exist on given path {0}, Error detail : {1}", path, io.ToString()), LogHelper.LogLevel.Error); 
      MailComponent.SendMail(io.ToString(), string.Format("Folder does not exist on given path {0}.Please re-create folder, grant permission and re-start the UPC utility.", path)); 
      throw io; 
     } 
     catch (Exception ex) 
     { 
      LogHelper.Log(string.Format("General error occured on Folder {0}, Error detail : {1}", path, ex.ToString()), LogHelper.LogLevel.Error); 
      MailComponent.SendMail(ex.ToString(), "General error occured"); 
      throw ex; 
     } 
    } 
+0

看看[this](http://www.novell.com/support/kb/doc.php?id=7006001)。我希望这会帮助你。 –

通过原生的Windows GetSecurityInfo()函数的调用产生的错误。你可以在NativeObjectSecurity类的源代码中看到这个。错误64或0x40的十六进制具有winerror.h以下定义:

ERROR_NETNAME_DELETED

指定的网络名不再可用。

因此,您的问题很可能与通过网络访问文件夹相关。

+0

那么,我怎么能管理这个错误,理想情况下它应该被捕获并记录在日志文件中。 –

+0

@NeerajDubey:你的代码中有很多异常处理。展开并捕获'InvalidOperationException'。如果你特别想处理“错误64”,你将不得不解析异常信息。在链接的参考源中,您可以看到如何抛出异常。但是,根据.NET源代码的具体情况,将会在您的代码与您不能控制的内容之间产生紧密耦合。 –