Avatar billede spif2001 Nybegynder
02. januar 2006 - 11:30 Der 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:

System.Diagnostics.Process.Start(@"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\regsvcs.exe", @"/fc C:\myService.dll");

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.

What to do?
Avatar billede dr_chaos Nybegynder
02. januar 2006 - 17:01 #1
Avatar billede spif2001 Nybegynder
03. januar 2006 - 10:32 #2
har haft fat i den nævnte artikel og implemeteret det i min kode. Googling er jo det første man prøver :).

Men den starter ikke servicen. Den kan godt create den, men den går ikke i gang.

Så jeg hentede errorcoden via
[DllImport("kernel32.dll")]
public static extern int GetLastError(); 

og den brokker sig over, at det ikke er en exe fil jeg prøver at starte.

Men for hulen da...

Når jeg gør det manuelt kan jeg jo godt starte en dll service.
Avatar billede spif2001 Nybegynder
03. januar 2006 - 10:34 #3
Forklaring til koden hos MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp

ERROR_BAD_EXE_FORMAT
193     %1 is not a valid Win32 application.
Avatar billede spif2001 Nybegynder
03. januar 2006 - 10:55 #4
Her er koden til Install metoden:

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;

    int SERVICE_ALL_ACCESS            = 
        (STANDARD_RIGHTS_REQUIRED    |
        SERVICE_QUERY_CONFIG        |
        SERVICE_CHANGE_CONFIG        |
        SERVICE_QUERY_STATUS        |
        SERVICE_ENUMERATE_DEPENDENTS |
        SERVICE_START                |
        SERVICE_STOP                |
        SERVICE_PAUSE_CONTINUE      |
        SERVICE_INTERROGATE          |
        SERVICE_USER_DEFINED_CONTROL);
    int SERVICE_AUTO_START = 0x00000002;
    #endregion Constants declaration.

    try
    {
        IntPtr  sc_handle = OpenSCManager(null,null,SC_MANAGER_CREATE_SERVICE);

        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;
        }

    }
    catch(Exception e)
    {
        throw e;
    }
}
Avatar billede spif2001 Nybegynder
06. januar 2006 - 09:19 #5
Har droppet denne fremgangsmåde, da jeg ikke har en .EXE men en .DLL.

Lukker her og opretter i stedet følgende spørgsmål:
http://www.eksperten.dk/spm/677300
Avatar billede spif2001 Nybegynder
06. januar 2006 - 09:19 #6
.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester