2013-05-20 2 views
0

Мне нужно запустить команду оболочки «manage-bde» из кода C#.выполнить команду оболочки (manage-bde) как администратор с C#

Основной процесс приложения уже запущен как администратор и повышен.

Я использовал код из: Пример самоподобия UAC на веб-сайте MS для подтверждения процесса приложения. (http://code.msdn.microsoft.com/windowsdesktop/CSUACSelfElevation-644673d3)

Однако, когда я пытаюсь запустить manage-bde из кода C#, я получаю «Систему не удается найти указанный файл».

 Process p = new Process(); 
     p.StartInfo.FileName = "C:\\Windows\\System32\\manage-bde.exe"; 
     p.StartInfo.UseShellExecute = true; 
     p.Start(); 

В качестве обходного пути я попытался создать командный файл, который запускает команду.

 string batchFileName = DateTime.Now.Ticks + ".bat"; 
     StreamWriter writer = new StreamWriter(batchFileName); 
     writer.WriteLine("manage-bde"); 
     writer.Flush(); 
     writer.Close();    
     Process p = new Process(); 
     p.StartInfo.FileName = batchFileName;    
     p.StartInfo.UseShellExecute = true;        
     p.Start(); 

Пакетный файл написан и выполнен успешно; Однако команда «manage-bde» не распознается.

Я изменил код, чтобы использовать глагол «runas» и использовать пароль администратора, и это работает, но я хочу, чтобы командный файл работал без необходимости предоставления пароля администратора. Текущий зарегистрированный пользователь уже является администратором на компьютере, но пакетный файл не выполняется с существующими правами администратора. Мне нужен пакетный файл для выполнения и управления-bde для успешного запуска.

Вашей помощи или совета будет очень высоко оценил :)

пс: некоторые другие, чем управлять-BDE прекрасно работают без необходимости администратора команды RunAs.

+0

'Я использовал код: пример самоподобия UAC на веб-сайте MS для подтверждения процесса приложения был повышен, если это так с этим связан значительный код, включая вызовы в собственный API Windows. Вы полностью выполнили решение? Он также использует Windows Identity Framework. Опять же, вы *** полностью внедрили решение в этом примере? –

+0

Я добавил NativeMethods.cs и скопировал соответствующую функцию «IsElevated» из этого примера; функция возвращает true.Я использовал это только для подтверждения того, что мой процесс находится на повышенном уровне при запуске процесса пакетного файла – mymo

+0

, вызывающего «RunAs» с именем пользователя и паролем, заставляет process.start вызывать собственный метод (CreateProcessWithLogonW). Это создает новый контекст безопасности и запускает приложение (manage-bde в этом случае) из него. Этот новый контекст безопасности представляет собой 64-битный контекст, который не перенаправляется при доступе к системе32. Если я не использую имя пользователя и пароль, вызываемый метод native будет: (CreateProcess). Это запустит новый процесс в том же контексте безопасности вызывающего приложения (которое представляет собой 32-битный контекст в моем случае выше). В результате доступ перенаправляется на syswow64, и файл не найден. – mymo

ответ

0

Причиной поведения, с которым я столкнулся, был редиректор файловой системы Windows.

В большинстве случаев, когда 32-битное приложение пытается получить доступ% WINDIR% \ system32, доступ перенаправляется% WINDIR% \ SysWOW64

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx

Моя сборка приложение было 32 бит. Всякий раз, когда он пытался получить доступ к окнам System32, он автоматически перенаправлял его на SysWow64, который не содержит «manage-bde.exe». Я изменил сборку на 64 бита, а затем приложение могло получить доступ к управлению-bde.exe из System32

0

Даже если вы работаете как пользователь Administrator, вы не полностью подняты, если UAC запущен. Это означает, что у вас появится приглашение UAC или вам будет предложено ввести пароль.

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

Альтернативой, конечно же, является отключение UAC, но это нежелательно в большинстве ситуаций.

+0

ОП конкретно указано ', но я хочу, чтобы командный файл работал без необходимости предоставления пароля администратора, что сделало это решение полностью недействительным. –

+0

@ MichaelPerrenoud этого не заметил, спасибо, что указали это. Я обновил свой ответ. – PhonicUK

+0

@PhonicUK благодарит за ваш ответ. Точка, в которой я запускаю процесс (Process.Start()), мой вызывающий процесс повышен. Я подтвердил, что, вызвав IsElevated из упомянутого выше кода. Он работает только успешно, если я предоставляю глагол runas и вводим имя пользователя и пароль администратора с помощью процесса startInfo – mymo

Смежные вопросы