Решение, которое я использую для такого рода вещей (когда вы пытаетесь запустить процесс из ASP.NET, которому требуются права администратора), заключается в следующем:
- Пишите все, что вам нужно, какСамостоятельная служба WCF.Желательно, чтобы служба REST Http, чтобы ее можно было легко вызвать (даже используя для проверки только браузер)
- Убедитесь, что ваша служба запущена с использованием учетной записи администратора.Вы можете использовать планировщик задач, чтобы убедиться, что служба работает постоянно, а также запускаться с использованием учетной записи администратора.
- Выполнять методы в службе из приложения ASP.NET с помощью клиента WCF
И это работает постоянно, независимо от того, какой «процесс» я пытаюсь запустить из приложения ASP.NET.
Теперь, что касается деталей (кода), позвольте мнезнать, если вам нужна помощь.Приведенный ниже код - это код, который вы бы использовали в консольном приложении, чтобы сделать его самостоятельно размещенной службой WCF.
В этом случае это служба Http, прослушивающая порт 7654.
static void Main(string[] args)
{
var webServiceHhost = new WebServiceHost(typeof(AppCmdService), new Uri("http://localhost:7654"));
ServiceEndpoint ep = webServiceHhost.AddServiceEndpoint(typeof(AppCmdService), new WebHttpBinding(), "");
var serviceDebugBehavior = webServiceHhost.Description.Behaviors.Find<ServiceDebugBehavior>();
serviceDebugBehavior.HttpHelpPageEnabled = false;
webServiceHhost.Open();
Console.WriteLine("Service is running");
Console.WriteLine("Press enter to quit ");
Console.ReadLine();
webServiceHhost.Close();
}
AppCmdService - это класс службы WCF, который выглядит следующим образом (в моем случае).В вашем случае вам, вероятно, не нужен ответ от вашего сервиса.В моем случае я получаю ответ от Json.Реальная реализация того, что вы пытаетесь сделать, очевидно, будет другой.Но я предполагаю, что у вас уже есть этот кусок.Так что просто вызовите метод этого класса отсюда.
[ServiceContract]
public class AppCmdService
{
[WebGet(UriTemplate = "/GetCurrentExcutingRequests/?", ResponseFormat= WebMessageFormat.Json)]
[OperationContract]
public IEnumerable<ExecutingRequestJson> GetCurrentExcutingRequests()
{
return CurrentExecutingRequestJsonProvider.GetCurrentExecutingRequests("localhost");
}
}
На вашей стороне ASP.NET вам на самом деле не нужен клиент WCF.Все, что вам нужно, это способ сделать http-вызов в службу.Таким образом, вы можете просто использовать HttpWebRequest для вызова вашего сервиса, который, в свою очередь, выполнит ваш процесс.
Надеюсь, все это имеет смысл?