ExecuteCommand servicecontroller - невозможно выполнить команду в службе

Я использую функцию executecommand сервисного контроллера, например:

            ServiceController serviceController = new ServiceController("a Service",
                Environment.MachineName);

            serviceController.ExecuteCommand(129);

И в сервис-контроллере:

    protected override void OnCustomCommand(int command)
    {
        base.OnCustomCommand(command);

        // Depending on the integer passed in, the appropriate method is called.
        switch (command)
        {
            case 129:
                RestartSpooler();
                break;
            case 131:
                InstallPrinter();
                break;
            case 132:
                DeletePrinter();
                break;
        }
    }

Однако, несмотря на вызов любой из команд из вызывающего кода (код попадает в строку, затем переходит, без исключений), ничего не происходит. Почему? Это все на локальной машине, и у меня есть полные права администратора.

Спасибо


person blade33    schedule 27.04.2011    source источник
comment
Должно работать так, как вы описываете. Убедитесь, что вы правильно установили службу, и ваши действия customCommand делают то, что вы хотите.   -  person username    schedule 27.04.2011
comment
Я знаю, что это очень поздно, но это может быть проблема с разрешением. Вы пытались поставить try/catch вокруг вызова команды execute и посмотреть, что показывает точная ошибка?   -  person John Odom    schedule 15.04.2015


Ответы (2)


Вы должны пытаться выполнить команду для остановленной службы. Добавьте что-то вроде следующего:

    if (serviceController1.Status == ServiceControllerStatus.Stopped)
    {
        serviceController1.Start();
    }
    serviceController1.ExecuteCommand(192);
person user1017815    schedule 28.10.2011

Я не нашел ни одной причины, почему это не должно работать. Вот рабочий пример службы Windows с пользовательской командой

public partial class TestService : ServiceBase
{
    public TestService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args) { }

    protected override void OnStop() { }

    protected override void OnCustomCommand(int command)
    {
        base.OnCustomCommand(command);

        switch (command)
        {
            case 129:
                //
                break;
            case 131:
                //
                break;
            case 132:
                //
                break;
        }
    }
}

Установщик службы

[RunInstaller(true)]
public partial class Installer : System.Configuration.Install.Installer
{
    public Installer()
    {
        InitializeComponent();

        _processInstaller = new ServiceProcessInstaller();
        _processInstaller.Account = ServiceAccount.LocalSystem;

        _serviceInstaller = new ServiceInstaller();
        _serviceInstaller.StartType = ServiceStartMode.Manual;
        _serviceInstaller.ServiceName = "TestService";

        Installers.Add(_serviceInstaller);
        Installers.Add(_processInstaller);
    }

    private readonly ServiceInstaller _serviceInstaller;
    private readonly ServiceProcessInstaller _processInstaller;
}

Использование службы

var serviceController = new ServiceController("TestService", Environment.MachineName);
serviceController.ExecuteCommand(129);
person username    schedule 27.04.2011
comment
@blade33 Вы тестировали свои методы отдельно? - person username; 27.04.2011
comment
Да, было одно исключение, которое я исправил, но все равно возникает та же проблема. - person blade33; 27.04.2011
comment
@blade33 Попробуйте добавить в свою команду что-то простое для проверки (например, запись в файл или около того) - person username; 27.04.2011