02. januar 2006 - 11:30Der er
5 kommentarer og 1 løsning
Installere en service fra kode
Jeg har en dll, som jeg under en installation vil oprette som service og starte den service.
Dll’en er en mellemstation, hvis metoder bliver kaldt fra en C++ app, og delegerer disse kald videre til en WebService. Dvs den også er en WebService klient.
Under udvikling, har jeg registreret den manuelt, ved at bruge ”RegSvcs /fc service.dll” fra en kommando prompt og derefter gået ind i Komponenttjenester, ændret sikkerhedsindstillinger og startet den manuelt.
Det duer jo ikke rigtigt, når den skal installeres hos en bruger. Derfor vil jeg gerne gøre det hele automatisk under installationen.
Derfor har jeg i mit Setup project lavet en CustomInstall fil, der i AfterInstall eventet skal ordne forskellige ting.
Mit problem er selve registreringen af servicen. Før brugte jeg denne fremgangsmåde:
Men det duer ikke, da servicen skal have sikkerhedsindstillingerne ændret. Og så vidt jeg kan se, ved at skrive RegSvcs /?, har man ikke sådanne muligheder med RegSvcs.
De ændringer til sikkerheden, der skal ændres er, at der ikke skal være autorisation (adgangskontrol) for programmet og at Godkendelsesniveau for kald skal sættes til Intet.
public bool InstallService(string svcPath, string svcName, string svcDispName) { #region Constants declaration. int SC_MANAGER_CREATE_SERVICE = 0x0002; int SERVICE_WIN32_OWN_PROCESS = 0x00000010; //int SERVICE_DEMAND_START = 0x00000003; int SERVICE_ERROR_NORMAL = 0x00000001;
int STANDARD_RIGHTS_REQUIRED = 0xF0000; int SERVICE_QUERY_CONFIG = 0x0001; int SERVICE_CHANGE_CONFIG = 0x0002; int SERVICE_QUERY_STATUS = 0x0004; int SERVICE_ENUMERATE_DEPENDENTS = 0x0008; int SERVICE_START =0x0010; int SERVICE_STOP =0x0020; int SERVICE_PAUSE_CONTINUE =0x0040; int SERVICE_INTERROGATE =0x0080; int SERVICE_USER_DEFINED_CONTROL =0x0100;
if (sc_handle.ToInt32() != 0) { IntPtr sv_handle = CreateService(sc_handle,svcName,svcDispName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,svcPath,null,0,null,null,null);
if(sv_handle.ToInt32() == 0) { #if(DEBUG) Console.WriteLine("CREATESERVICE ERROR = " + GetLastError()); #endif CloseServiceHandle(sc_handle); return false; } else { //now trying to start the service int i = StartService(sv_handle,0,null); #if(DEBUG) Console.WriteLine("CREATESERVICE ERROR = " + GetLastError()); #endif // If the value i is zero, then there was an error starting the service. // note: error may arise if the service is already running or some other problem. if(i==0) return false; CloseServiceHandle(sc_handle); return true; } } else { #if(DEBUG) Console.WriteLine("CREATESERVICE ERROR = " + GetLastError()); #endif return false; }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.