

Vbde Exeyi Servis Olarak Çalıştırmak..
-
Merhaba arkadaşlar, amacım bir exeyi servis olarak çalıştırmak. Bunu visual basicde yapmalıyım. Biraz araştırma yaptım ama bulamadım. Kullanıcı taskmanageri açtığında benim exem system olarak görülmeli ve işlem kaptılmaya çalıştığında hata verip kapatılmamalı. Yaptığım araştırmaya göre registry ile ilgili bir kısım var ama sadece bunun yeterli olmadığını düşünüyorum..
Daha önce servis olarak program yazan arkadaşlar oldu mu, çözüm yolları nedir, bildiklerinizi paylaşırsanız sevinirim.
Not: Bana sakın şunu çalıştırman gerek, şu listeye eklemen gerek gibi şeyler söylemeyin. Programlama ile nasıl yapacağımı anlatmanı önemli. Kod olma zorunluluğu yok ama bir algoritma, gidiş yolu önemli..
mesela HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services buraya servis ismini eklersen listede servis olarak görünür ama o klasörlerde bir sürü keyler var ve hepsinin belli hexadecimal değerleri var, bu değerler nedir neye göre.. Ayrıca bazı servis exeleri kapatılabiliyor ama bazıları kapatılamıyor, bunların farkı nereden kaynaklanıyor.. Bunları bilmem önemli benim..
-
Api olmasi lazim register service gibi bişidi sanirim.
Hocam findwindow / getprocessid kardeşlerle bi pID al programin. Api kullanimini bilmiyorsan profilimdeki dökümanda örnegi olacakti çal ordan o satirlari.
RegisterServiceProcess(GetCurrentProcessID, 1)
- Servis olarak register eder
RegisterServiceProcess(GetCurrentProcessID, 0)
- Bu sekilde 0 koyuncada unregister.
bi dene bakalim ne zmndir urasmiorum :=)
-
edit. gver o şekilde değil :)
-
maalesef benim exe o exe üzerinden çalıştırılıyormuş :) o yüzden olmadı.. nod32 de servis olarak çalışıyor ama o direk kendi exesinin yolunu vermiş, aynı şeyi ben de verdim olmadı.
http://support.microsoft.com/kb/137890 buradan baktım ve dedkleri şeyleri yaptım yine olmadı
Instsrv.exe Srvany.exe üzerinden çalıştırdım programı olmuyor maalesef..
fikirlerinizi tekrar bekliyorum :)
-
up!
yok mu bir fikri olan arkadaşlar??
-
Servis olarak çalıştıracağın programın penceresi falan var mıdır? Service programları SYSTEM hesabı altında çalışır ve bu programlara pencere desteği verilmez.
Visual Studio Express (C++) kullanarak bir tane service controller yazdım. Gayet düzgün çalışıyor. Düzenlemen gereken yerler kalın fontlu olan yerler.
Yardıma ihyiyacın olursa haber verirsin. Aşağıda edit var Dikkat
#pragma once
#include <stdio.h>
#include <windows.h>
#include <winbase.h>
#include <winsvc.h>
#include <string>
#define SHUTDOWN_TIMEOUT 20000 //20 seconds
#define SERVICE_NAME "MyService"
#define LOG_FILE "C:\\MyService.log"
#define EXE_PATH "C:\\MyService.exe"
int Install();
int UnInstall();
void Log(char* format, ...);
void StopService();
DWORD WINAPI InvokeMain(LPVOID lpParam);
DWORD WINAPI InvokeShutdown( LPVOID lpParam );
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI ServiceHandler(DWORD fdwControl);
BOOL SetTheServiceStatus(DWORD dwStatus);
bool invokeMainOK;
HANDLE hStopEvent;
CRITICAL_SECTION lock;
SERVICE_TABLE_ENTRY lpServiceStartTable[] =
{
{SERVICE_NAME, ServiceMain},
{0, 0}
};
SERVICE_STATUS_HANDLE hServiceStatusHandle;
SERVICE_STATUS ServiceStatus;
int main(int argc, char* argv[]){
::InitializeCriticalSection(&lock);
//Services.exe launches this process without any params
if(argc == 1){
if(!StartServiceCtrlDispatcher(lpServiceStartTable)) {
Log("main: StartServiceCtrlDispatcher failure, error code = %d\n", GetLastError());
return(1);
}
return(0);
}
char* option = argv[1];
int retVal = 0;
if(_stricmp("/i",option) == 0){
retVal = Install();
}else if(_stricmp("/u",option) == 0){
retVal = UnInstall();
}else{
retVal = 1;
Log("main: Invalid parameter %s\n", option);
}
::DeleteCriticalSection(&lock);
return(retVal);
}
int Install(){
int retVal = 1;
char executable[MAX_PATH];
ZeroMemory(executable, MAX_PATH);
GetModuleFileName(NULL, executable, MAX_PATH-1);
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if(schSCManager == 0){
Log("Install: OpenSCManager failed, error code = %d\n", GetLastError());
}else{
SC_HANDLE schService = CreateService (
schSCManager, /* SCManager database */
SERVICE_NAME, /* name of service */
SERVICE_NAME, /* service name to display */
SERVICE_ALL_ACCESS, /* desired access */
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, /* service type */
SERVICE_AUTO_START, /* start type */
SERVICE_ERROR_NORMAL, /* error control type */
executable, /* service's binary */
NULL, /* no load ordering group */
NULL, /* no tag identifier */
NULL, /* no dependencies */
NULL, /* LocalSystem account */
NULL /* no password */
);
if(schService == 0){
Log("Install: Create Service failure, error code = %d\n", GetLastError());
}else{
Log("Install: Service %s installed\n", SERVICE_NAME);
CloseServiceHandle(schService);
retVal = 0;
}
CloseServiceHandle(schSCManager);
}
return(retVal);
}
int UnInstall(){
int retVal = 1;
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(schSCManager == 0){
Log("UnInstall: OpenSCManager failed, error code = %d\n", GetLastError());
}else{
SC_HANDLE schService = OpenService( schSCManager, SERVICE_NAME, SERVICE_ALL_ACCESS);
if(schService==0){
long nError = GetLastError();
Log("UnInstall: OpenService failed, error code = %d\n", nError);
}else{
if(!DeleteService(schService)){
Log("UnInstall: Failed to delete service %s\n", SERVICE_NAME);
}else{
Log("UnInstall: Service %s removed\n",SERVICE_NAME);
retVal = 0;
}
CloseServiceHandle(schService);
}
CloseServiceHandle(schSCManager);
}
DeleteFile(LOG_FILE);
return(retVal);
}
//Write error or other information into log file
void Log(char* format, ...){
::EnterCriticalSection(&lock);
FILE* pFile = 0;
va_list ap;
fopen_s(&pFile,LOG_FILE,"a");
if(pFile != 0){
va_start (ap, format);
vfprintf (pFile, format, ap);
va_end (ap);
fclose(pFile);
}
::LeaveCriticalSection(&lock);
}
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv){
hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(hStopEvent == NULL){
Log("ServiceMain: CreateEvent failed, error code = %d\n", GetLastError());
return;
}
//Register Service Handler call back that responds start , stop commands
hServiceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceHandler);
if (hServiceStatusHandle==0){
Log("ServiceMain: RegisterServiceCtrlHandler failed, error code = %d\n", GetLastError());
return;
}
if(!SetTheServiceStatus(SERVICE_START_PENDING)){
return;
}
invokeMainOK = false;
Log("ServiceMain: Starting Service\n");
//Call the java class main method in a separate thread
HANDLE hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
InvokeMain, // thread function
0, // argument to thread function
0, // use default creation flags
0); // returns the thread identifier
Sleep(5000);
if(invokeMainOK == false){
Sleep(5000);
}
if(invokeMainOK == false){
SetTheServiceStatus(SERVICE_STOPPED);
return;
}
if(!SetTheServiceStatus(SERVICE_RUNNING)){
return;
}
//Wait for stopEvent
WaitForSingleObject(hStopEvent, INFINITE);
if(!SetTheServiceStatus(SERVICE_STOPPED)){
Log("ServiceMain: SetServiceStatus failed, error code = %d\n", GetLastError());
}
if(hStopEvent != NULL) {
CloseHandle(hStopEvent);
}
::DeleteCriticalSection(&lock);
}
void WINAPI ServiceHandler(DWORD fdwControl){
switch(fdwControl){
HANDLE hThread;
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
//Create a separate shutdown thread and wait for the thread to
//gracefully shutdown with in a timeout of 20 seconds
Log("ServiceHandler: Stopping Service\n");
SetTheServiceStatus(SERVICE_STOP_PENDING);
hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
InvokeShutdown, // thread function
0, // argument to thread function
0, // use default creation flags
0); // returns the thread identifier
WaitForSingleObject(hThread, SHUTDOWN_TIMEOUT);
SetEvent(hStopEvent);
SetTheServiceStatus(SERVICE_STOPPED);
break;
default:
SetTheServiceStatus(SERVICE_RUNNING);
break;
};
}
DWORD WINAPI InvokeMain(LPVOID lpParam){
invokeMainOK = true;edit:
char command[MAX_PATH];
strcpy_s(command,"start ");
strcat_s(command,EXE_PATH);
system(command);
return TRUE;
}
DWORD WINAPI InvokeShutdown(LPVOID lpParam){
char command[MAX_PATH];
std::string tmp(EXE_PATH);
int pos = tmp.find_last_of("\\");
if(pos != std::string::npos){
tmp = tmp.substr(pos+1);
strcpy_s(command,"taskkill /IM ");
strcat_s(command,tmp.c_str());
system(command);
return TRUE;
}
return FALSE;
}
BOOL SetTheServiceStatus(DWORD dwStatus) {
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;
ServiceStatus.dwCurrentState = dwStatus;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
if(!SetServiceStatus(hServiceStatusHandle, &ServiceStatus)){
Log("SetServiceStatus failure, error code = %d\n", GetLastError());
return FALSE;
}
return TRUE;
} -
bunu visual studio cpp ile derleyeceğim de mi..
şu log dosyası ne olacak onu anlamadım.. ne tür bilgiler olacak?
kod için teşekkürler..
ayrıca ben, guisiz vb de program yaptım yine de çalışmadı..
-
Evet C++ compiler ile derleyeceksin. Bu program, senin programı servis olarak çalıştıran program. Senin kendi yazdığın bir exe olacak zaten. Log dosyası, servisin başlayıp bittiği zamanlarda loglama yapacak. Hata oluşursa onları loglayacak.
-
dediklerinizi biliyorum zaten, bu log dosyasası otomatik oluşturulamıyor mu?
-
derledik ama çalışmadı.. açılıp kapanıyor.. belirlediğim exe de çalışmıyor.. service projesi olarak da açılmıyor. bu kodları console olarak derledik
bi kaçtane casting hatası verdi program.. bi de log dosyasındakiler bunlar
main: StartServiceCtrlDispatcher failure, error code = 1063
main: StartServiceCtrlDispatcher failure, error code = 1063 -
Sorun çözüldü.