Как сделать, чтобы сервис при старте получал командную строку?
Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса.
если его запустит user, то exe-шник должен вывести диалог.
Думаю отличать user'а от системы анализируя командную строку.
User может просто запустить exe-шник — без параметров.
Пока есть лишь решение сделать exe-шник скрытым, а поставлять
*.lnk-файл с командной строкой типа "file.exe /user", а сервис
будет по-прежнему стартоваться системой без параметров.
Второе решение — можно видимо смотреть, кто нас запустил и соответственно
действовать.
Re: Как сделать, чтобы сервис при старте имел argc>=2?
Здравствуйте yaroslav_v, Вы писали:
YV>Как сделать, чтобы сервис при старте получал командную строку?
YV>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса. YV>если его запустит user, то exe-шник должен вывести диалог.
Когда система запускает твою службу, то вызов StartServiceCtrlDispatcher () успешен, когда ты поднимаешь екзешник руками -- то нет. Вот и вся проверка.
Signed, [TSS] /SDL/
Re[2]: Как сделать, чтобы сервис при старте имел argc>=2?
От:
Аноним
Дата:
13.12.01 11:03
Оценка:
Здравствуйте TSS, Вы писали:
TSS>Здравствуйте yaroslav_v, Вы писали:
YV>>Как сделать, чтобы сервис при старте получал командную строку?
YV>>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса. YV>>если его запустит user, то exe-шник должен вывести диалог.
TSS>Когда система запускает твою службу, то вызов StartServiceCtrlDispatcher () успешен, когда ты поднимаешь екзешник руками -- то нет. Вот и вся проверка.
именно т.к. сервис тоже можно запускать с параметрами =)
вот пример кода, который я использовал для подобной реализации. НО она отличается низким быстродействием при запуске как экзешника. т.к. вышеупомянутая функция при запуске не как сервис тормозит очень сильно.
причина моей реализации была : СОМ-компонент, который запущенный как сервис регистрирует себя. зачем это нужно было — для регистрации компонентов на удаленной машине.
вот кусок кода.
// ServiceSample.cpp : Defines the entry point for the console application.
//
Здравствуйте TSS, Вы писали:
TSS>Здравствуйте yaroslav_v, Вы писали:
YV>>Как сделать, чтобы сервис при старте получал командную строку?
YV>>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса. YV>>если его запустит user, то exe-шник должен вывести диалог.
TSS>Когда система запускает твою службу, то вызов StartServiceCtrlDispatcher () успешен, когда ты поднимаешь екзешник руками -- то нет. Вот и вся проверка.
именно т.к. сервис тоже можно запускать с параметрами =)
вот пример кода, который я использовал для подобной реализации. НО она отличается низким быстродействием при запуске как экзешника. т.к. вышеупомянутая функция при запуске не как сервис тормозит очень сильно.
причина моей реализации была : СОМ-компонент, который запущенный как сервис регистрирует себя. зачем это нужно было — для регистрации компонентов на удаленной машине.
вот кусок кода.
// ServiceSample.cpp : Defines the entry point for the console application.
//
Здравствуйте Lokki, Вы писали:
YV>>>Как сделать, чтобы сервис при старте получал командную строку?
Задать в свойствах службы / в реестре.
YV>>>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса. YV>>>если его запустит user, то exe-шник должен вывести диалог.
TSS>>Когда система запускает твою службу, то вызов StartServiceCtrlDispatcher () успешен, когда ты поднимаешь екзешник руками -- то нет. Вот и вся проверка.
L>именно т.к. сервис тоже можно запускать с параметрами =)
Это к чему ?
У службы есть две функции которые можно "запустить с параметрами". Одна из них -- main (argc, argv), которая вызываеться из C/C++ Runtime. Вторая -- ServiceMain (argc, argv), вызываемая через StartService.
Это разные функции с разными параметрами. Одни (для main) задаються в командной строке (например при CreateProcess), другие в реестре, которые находяться в реестре и используються MMC (например) при запуске службы через StartService ()
P.S. См. MSDN на предмет описания main() и StartService ()
Signed, [TSS] /SDL/
Re[4]: Как сделать, чтобы сервис при старте имел argc>=2?
Здравствуйте TSS, Вы писали:
TSS>Здравствуйте Lokki, Вы писали:
YV>>>>Как сделать, чтобы сервис при старте получал командную строку?
TSS>Задать в свойствах службы / в реестре.
YV>>>>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса. YV>>>>если его запустит user, то exe-шник должен вывести диалог.
TSS>>>Когда система запускает твою службу, то вызов StartServiceCtrlDispatcher () успешен, когда ты поднимаешь екзешник руками -- то нет. Вот и вся проверка.
L>>именно т.к. сервис тоже можно запускать с параметрами =)
TSS>Это к чему ? TSS>У службы есть две функции которые можно "запустить с параметрами". Одна из них -- main (argc, argv), которая вызываеться из C/C++ Runtime. Вторая -- ServiceMain (argc, argv), вызываемая через StartService. TSS>Это разные функции с разными параметрами. Одни (для main) задаються в командной строке (например при CreateProcess), другие в реестре, которые находяться в реестре и используються MMC (например) при запуске службы через StartService ()
TSS>P.S. См. MSDN на предмет описания main() и StartService ()
я говорю о проблеме определения — как сервис мы или нет.
если использовать соглашение, что
argv[1]=="Service"
argv[1]=="Prog"
то это всё же не гарантирует , что программа запущена как сервис потому, что можно сделать cmd.exe /c prog.exe Service
Re[5]: Как сделать, чтобы сервис при старте имел argc>=2?
Здравствуйте Lokki, Вы писали:
TSS>>Это к чему ? TSS>>У службы есть две функции которые можно "запустить с параметрами". Одна из них -- main (argc, argv), которая вызываеться из C/C++ Runtime. Вторая -- ServiceMain (argc, argv), вызываемая через StartService. TSS>>Это разные функции с разными параметрами. Одни (для main) задаються в командной строке (например при CreateProcess), другие в реестре, которые находяться в реестре и используються MMC (например) при запуске службы через StartService ()
TSS>>P.S. См. MSDN на предмет описания main() и StartService () L>я говорю о проблеме определения — как сервис мы или нет. L>если использовать соглашение, что L>argv[1]=="Service" L>argv[1]=="Prog" L>то это всё же не гарантирует , что программа запущена как сервис потому, что можно сделать cmd.exe /c prog.exe Service
Гарантия, что сервис запущен как сервис находиться в Service Control Manager: StartService () -> StartServiceCtrlDispatcher () -- см. предыдущие мои ответы.
YV>Как сделать, чтобы сервис при старте получал командную строку? YV>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса.
Итак, командная строка ни при чем.
Нужно получить имя процесса, породившего процесс твоего экзешника. Если это не %SystemRoot%\system32\services.exe (WinNT 4.0, для W2k подскажет Alex Fedotov, я сам не помню), то мы работаем в user mode. Если же родитель процесса — services.exe (AKA SCM), то мы работаем в режиме сервиса. В системе сервисы запускает только SCM.
---
С уважением,
Игорь
Re[2]: Как сделать, чтобы сервис при старте имел argc>=2?
Здравствуйте Игорь Вартанов, Вы писали:
YV>>Задача: отличить запуск exe-шника user'ом от запуска его системой как сервиса.
ИВ>Нужно получить имя процесса, породившего процесс твоего экзешника. Если это не %SystemRoot%\system32\services.exe (WinNT 4.0, для W2k подскажет Alex Fedotov, я сам не помню)
В Win2K/XP все тоже самое.
-- Alex Fedotov
Re[6]: Как сделать, чтобы сервис при старте имел argc>=2?
Здравствуйте TSS, Вы писали:
TSS>Здравствуйте Lokki, Вы писали:
TSS>>>Это к чему ? TSS>>>У службы есть две функции которые можно "запустить с параметрами". Одна из них -- main (argc, argv), которая вызываеться из C/C++ Runtime. Вторая -- ServiceMain (argc, argv), вызываемая через StartService. TSS>>>Это разные функции с разными параметрами. Одни (для main) задаються в командной строке (например при CreateProcess), другие в реестре, которые находяться в реестре и используються MMC (например) при запуске службы через StartService ()
TSS>>>P.S. См. MSDN на предмет описания main() и StartService () L>>я говорю о проблеме определения — как сервис мы или нет. L>>если использовать соглашение, что L>>argv[1]=="Service" L>>argv[1]=="Prog" L>>то это всё же не гарантирует , что программа запущена как сервис потому, что можно сделать cmd.exe /c prog.exe Service
TSS>Гарантия, что сервис запущен как сервис находиться в Service Control Manager: StartService () -> StartServiceCtrlDispatcher () -- см. предыдущие мои ответы.
дык я именно это и сказал.
хм.
кроме того привел кусок кода, который сам же и юзал.
Re[3]: Как сделать, чтобы сервис при старте имел argc>=2?