使用完整路径到可执行文件时,Windows 10无法访问指定的设备,路径或文件,以管理员身份运行

时间:2015-11-06 15:51:01

标签: c# windows encoding filesystems windows-10

注意:我已将目录替换为a,将exe替换为b.exe,我会重复我所做的每项测试,以确保它不是打字语法。

我有一个非常简单的部分代码,可以从Windows XP到Windows 7完美运行。

var processPath = @"c:\a\b.exe" ; // this exe exists on my computer
Process.Start(processPath); 

以及

Directory.Exists(@"c:\a\") returns false on Windows 10. 

由于Windows 10(我尚未测试8和8.1),第一个代码将抛出System.ComponentModel.Win32Exception(“未找到指定文件”),第二个代码将返回false。 。

我也注意到当我使用Windows运行窗口(Windows Key + R)运行“c:\ a \ b.exe”时,它的行为相同。

是否有解决此问题的解决方法?优先考虑的是一种不需要重新编译的解决方案。

NB

  • 我以管理员身份运行Windows
  • 用户可以访问该文件(为计算机中的所有人启用安全属性)
  • c:\b.exe有效!!
  • 我不是在寻找像更改应用程序工作目录和运行Process.Start(“b.exe”)之类的解决方案。

谢谢大家,

编辑:

  • 指定的路径不是错误的,文件不会丢失。
  • 计算机的每个用户对文件夹和文件(a目录和b.exe
  • 的总控制级别的加入
  • 当我将exe放在根目录上时工作:“c:\ b.exe”
  • 与仅包含“echo Hello inside”的.bat文件相同的行为
  • Console.WriteLine(String.Join("\r\n", Directory.GetDirectories(@"c:\")))显示目录c:\a

更新:

icalcs c:\a\的结果:

c:\a\ Tout le monde:(OI)(CI)(F)
         BUILTIN\Administrateurs:(I)(OI)(CI)(F)
         AUTORITE NT\SystŠme:(I)(OI)(CI)(F)
         BUILTIN\Utilisateurs:(I)(OI)(CI)(RX)
         AUTORITE NT\Utilisateurs authentifi‚s:(I)(M)
         AUTORITE NT\Utilisateurs authentifi‚s:(I)(OI)(CI)(IO)(M)

icalcs c:\a\b.exe的结果:

c:\a\b.exe Tout le monde:(I)(F)
               BUILTIN\Administrateurs:(I)(F)
               AUTORITE NT\SystŠme:(I)(F)
               BUILTIN\Utilisateurs:(I)(RX)
               AUTORITE NT\Utilisateurs authentifi‚s:(I)(M)

“Tout le monde”意味着每个人。

更新

关于最新消息,我能做到:

File.WriteAllBytes(@"c:\a\b.exe", somebinaries) ; 

但是我无法做到

FileInfo fileInfo = new FileInfo(@"c:\a\b.exe") ;  

投掷'System.NotSupportedException'。 StackTrace如下:

   à System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
   à System.IO.FileInfo.Init(String fileName, Boolean checkHost)
   à System.IO.FileInfo..ctor(String fileName)
   à ConsoleApplication1.Program.Main(String[] args) dans F:\MAPW10\Development\Sources\Tools\ConsoleApplication1\Program.cs:ligne 22
   à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   à System.Threading.ThreadHelper.ThreadStart()

2 个答案:

答案 0 :(得分:4)

我找到了!!

Windows 10资源管理器中的某些标签复制/粘贴时,文件路径中添加了一些额外的不可打印字节。

考虑这段代码:

Console.WriteLine(new DirectoryInfo(@"c:\a\"));
Console.WriteLine(new DirectoryInfo(@"‪c:\a\"));  

这些行看起来相同,不应引发任何异常(即使目录c:\a不存在),但实际上如果您在应用程序中复制/粘贴上面的代码,第二行将引发{{1使用单词:“不支持给定路径的格式”。

我最终检查了.NET源代码,发现方法StringExpressionSet.Canonicalize引发了NotSupportedException:

NotSupportedException

实际上:

...
 if (path.IndexOf( ':', 2 ) != -1)
      throw new NotSupportedException( Environment.GetResourceString( "Argument_PathFormatNotSupported" ) );
...

我在哪里抓到了它?

为了不犯任何打字错误,我习惯将目录路径从右键单击复制到文件 - > Console.WriteLine(@"c:\a\".IndexOf( ':', 2 )); // results -1 Console.WriteLine(@"‪c:\a\".IndexOf( ':', 2 )); // result 2 // Copy/Paste to test - > Properties

enter image description here

您现在被警告

答案 1 :(得分:1)

...SystŠme
...authentifi‚s

模糊目录和文件名使您很难帮助您。但是,有一个明显的摇滚可以看下,让重音人物严重受损,这样就不应该发生。该机器使用法语,但似乎使用的编码为1250,仅在东欧使用。一个非常奇怪的不匹配,特别是对于控制台模式应用程序。

如果真实的 a目录同样包含带有变音符号的字符,那么受损的icalcs.exe程序输出背后的任何根本原因也会影响文件系统名称编码。最后的结论是,这台机器非常恶心,需要极客小组的帮助才能变得更好。