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()
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