Windows 10 не может получить доступ к указанному устройству, пути или файлу при использовании полного пути к исполняемому файлу, запущенному от имени администратора



Примечание : Я заменил каталог на a, а exe-файл на b.exe, и я повторяю каждый тест, который я сделал, чтобы убедиться, что это не синтаксис набора текста.



У меня есть очень простой фрагмент кода, который отлично работает от Windows XP до Windows 7.



var processPath = @"c:ab.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. .



Я уже заметил и что такое же поведение, когда я бегу ". c:ab.exe " с помощью окна запуска windows (клавиша Windows + R).



Есть ли обходные пути для решения этой проблемы? Предпочтительно решение, которое не подразумевает перекомпиляции.

NB :




  • я запускаю windows от имени администратора


  • пользователь имеет доступ к файлу (атрибут безопасности enable for everyone in the computer).


  • c:b.exe работает !!

  • я не ищу ... решение, например, изменить рабочий каталог приложения и запустить процесс.Начало("b.exe").


Спасибо вам всем,



Правка:





  • указанный путь не является неправильным, и файл не отсутствует.

  • каждый пользователь компьютера в качестве общего уровня контроля имеет доступ к папке и файлу (a каталогу и b.exe)

  • работает, когда я помещаю exe в корневой каталог : "c:b.exe"

  • такое же поведение С.bat файл только с "echo Привет внутри "


  • Console.WriteLine(String.Join("rn", Directory.GetDirectories(@"c:"))) отображение каталога c:a


Обновление:



Результаты icalcs c:a:



c:a Tout le monde:(OI)(CI)(F)
BUILTINAdministrateurs:(I)(OI)(CI)(F)
AUTORITE NTSystŠme:(I)(OI)(CI)(F)
BUILTINUtilisateurs:(I)(OI)(CI)(RX)
AUTORITE NTUtilisateurs authentifi‚s:(I)(M)
AUTORITE NTUtilisateurs authentifi‚s:(I)(OI)(CI)(IO)(M)


Результаты icalcs c:ab.exe:



c:ab.exe Tout le monde:(I)(F)
BUILTINAdministrateurs:(I)(F)
AUTORITE NTSystŠme:(I)(F)
BUILTINUtilisateurs:(I)(RX)
AUTORITE NTUtilisateurs authentifi‚s:(I)(M)


"Tout le monde" означает всех.



Обновление :



По последним новостям, я могу сделать:



File.WriteAllBytes(@"c:ab.exe", somebinaries) ; 


Но я не могу этого сделать



FileInfo fileInfo = new FileInfo(@"c:ab.exe") ;  


Метательная Система.Исключение 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:MAPW10DevelopmentSourcesToolsConsoleApplication1Program.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()
591   2  

2 ответов:

Я нашел его !!

Это некоторые дополнительные непечатаемые байты, добавленные в путь к файлу при копировании / вставке из некоторых меток в проводнике Windows 10.

Рассмотрим этот фрагмент кода:

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

Эти строки выглядят одинаково и не должны вызывать никаких исключений (даже если Каталог c:\a не существует), но на самом деле, если вы копируете / вставляете код выше в приложении, вторая строка вызовет NotSupportedException со словами: "формат данного пути не является поддерживал ".

Я закончил проверку исходного кода .NET и нашел метод StringExpressionSet.Canonicalize , который вызвал исключение 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 -> Security

Введите описание изображения здесь

Теперь вы предупреждены !

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

Запутать каталог и имя файла очень трудно, чтобы помочь вам. Но есть один очевидный камень, под которым нужно смотреть, чтобы акцентированные символы были искажены так сильно, как это никогда не должно произойти. Машина говорит по-французски, но кодировка, которая, по-видимому, используется-1250, используется только в Восточной Европе. Очень странное несоответствие,особенно для консольного приложения.

Если реальное a каталог также содержит символы с диакритическими знаками, то любой корень причина за искореженными икалками.вывод exe-программы также может повлиять на кодировку имени файловой системы. Грубый вывод состоит в том, что эта машина довольно больна и нуждается в помощи от команды выродков, чтобы поправиться.

Comments

    Ничего не найдено.