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

时间:2016-04-25 07:40:10

标签: c# .net c#-4.0 console-application file-security

我正在努力获取文件夹的权限,然后才能在C#控制台应用程序中访问,文件夹的路径可以是ftp.Same的路径正在我的机器上工作但是当在生产服务器上部署时它开始投掷错误System.InvalidOperationException: Method failed with unexpected error code 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;
        }
    }

1 个答案:

答案 0 :(得分:0)

通过调用本机Windows str函数生成错误。您可以在NativeObjectSecurity类的源代码中看到这一点。十六进制中的错误64或0x40在winerror.h中具有以下定义:

  

GetSecurityInfo()

     

指定的网络名称不再可用。

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