2016-09-29 6 views
0

Я написал службу Windows, которая отлично работает. Это вызов (по командной строке) через ChatServer.exe {argument}, где {argument} является ключевой работой, такой как install, uninstall, start и stop.Начать служебную мысль ASP.net Page

Программа, для которой эта служба требует административных привилегий (поскольку она сама устанавливает/удаляет). Поэтому, если я начинаю cmd с администратором "D:\folder\chatserver.exe install", например, он устанавливает службу как следует.

Ну, моя проблема в том, что на моем сайте ASP.net я написал функцию (ниже), чтобы начать процесс, но я получаю исключение "740" ("the software required privilege elevation"), как если бы я отмечал аргумент «AsAdmin» моей функции «true», , я понимаю, что "UseShellExecute" не может быть правдой в качестве исключения.

public static int RunProcess(string ApplicationPath, string Parameters = "", bool AsAdmin = false) 
{ 
    try 
    { 
     global::System.Diagnostics.ProcessStartInfo startInfo = new global::System.Diagnostics.ProcessStartInfo(); 
     startInfo.UseShellExecute = AsAdmin; 
     if (AsAdmin) { startInfo.Verb = "runas"; } 
     startInfo.WorkingDirectory = global::System.IO.Path.GetDirectoryName(ApplicationPath); 
     startInfo.FileName = ApplicationPath; 
     if (!string.IsNullOrEmpty(Parameters)) { startInfo.Arguments = Parameters; } 
     startInfo.ErrorDialog = false; 
     global::System.Diagnostics.Process process = global::System.Diagnostics.Process.Start(startInfo); 
     process.WaitForExit(); 
     return process.ExitCode; 
    } 
    catch (global::System.ComponentModel.Win32Exception ex) { return ex.NativeErrorCode; } 
    catch { return -1; } 
} 

Что мне делать?

ответ

1

Вы попробовали ProcessStartInfo? Это позволяет вам добавить конкретный credentials. Проверьте приведенный ниже пример:

ProcessStartInfo myProcess = new ProcessStartInfo(path); 
myProcess.UserName = username; 
myProcess.Password = MakeSecureString(password); 
myProcess.WorkingDirectory = @"C:\Windows\System32"; 
myProcess.UseShellExecute = false; 
// elevate EDIT 
myProcess.Verb = "runas"; 
Process.Start(myProcess); 


private static SecureString MakeSecureString(string text) 
{ 
    SecureString secure = new SecureString(); 
    foreach (char c in text) 
    { 
     secure.AppendChar(c); 
    } 
    return secure; 
} 

Launch a process under another user's credentials

+0

thansk ted! невероятная вещь, которую я ЗНАЛ, но если забыл! как я мог? – SammuelMiranda

+0

попробовал, и это имело большой смысл, но я до сих пор получаю «Win32Exception», «Запрошенная операция требует повышения» – SammuelMiranda

+0

@SammuelMiranda - см. Мое редактирование 'myProcess.Verb =" runas ";' – Ted

0

В дополнение к ответу Теда, я хотел бы добавить следующее:

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

Возможно, вы захотите перекодировать консольные приложения как веб-API ASP.NET, возможно, размещенные в IIS или в службе Windows.

+0

Ирландский, спасибо за ответ, но просто для того, чтобы уточнить, это служба WINDOWS, явная точка - сделать мою страницу ASP.net способный вызвать «Пуск/Стоп» этой службы – SammuelMiranda

+0

Я получил один раз инженер по поддержке MS по этой самой проблеме. В итоге мы не должны вызывать службу Windows из веб-приложения. Это можно сделать, но это не поддерживается Microsoft. – IrishChieftain

1

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

Одним из решений является наличие «сторожевого» Windows Service, работающего с соответствующими привилегиями для взаимодействия с диспетчером управления службами (SCM), который принимает команды через, например, WCF на localhost, и позволяет вашему веб-приложению разговаривать с эта услуга, которая, в свою очередь, запускает или останавливает соответствующую услугу.

Это будет выглядеть следующим образом:

[Web Application] -- WCF --> [Watchdog Service] -- SCM --> [Chat Service] 

Таким образом, ваш веб-приложение отправляет через WCF команду StartService("ChatService"), а затем сторожевая служба запускает службу ChatService.

Теперь только сторожевая служба должна работать под административными привилегиями и защищать связь WCF, чтобы убедиться, что ее называют только аутентифицированные приложения, что обсуждается в других вопросах.

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

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

  • Нет связанных вопросов^_^