<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Servizi Windows</title>
        <link>http://community.dotnetwork.it/sabrina/category/26.aspx</link>
        <description>Post dedicati allo sviluppo di Servizi e applicazioni di servizio.</description>
        <language>it-IT</language>
        <copyright>Sabrina C.</copyright>
        <managingEditor>ziayeye@ziayeye.it</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Accedere e modificare le propriet&amp;agrave; di un Servizio (Storico)</title>
            <link>http://community.dotnetwork.it/sabrina/archive/2008/03/24/accedere-e-modificare-le-proprietagrave-di-un-servizio-storico.aspx</link>
            <description>&lt;p&gt;Fra le cose che succedono ad un programmatore, la presa in carico di un progetto sviluppato da un'altro programmatore è forse una delle più difficili, soprattutto se questo programmatore, benché bravissimo ad ottenere risultati, ha utilizzato per ottenerli una serie di sotterfugi tali per cui, chi prende in carico il suo progetto si trova a non essere in grado neppure di ricompilarlo. In un occasione di questo tipo uno dei problemi che ho riscontrato è stato l'uso da parte di questo collega di una DLL non COM, non managed (in parole povere NON), per ovviare alla mancanza all'interno del framework di una classe che ci permetta di manipolare la configurazione dei servizi di una macchina. &lt;/p&gt;
&lt;p&gt;Ovviamente, manipolare la configurazione di un servizio non fa parte delle cose che si fanno ogni mattina nelle nostre applicazioni .NET, in questo caso, l'applicazione è una Console per la configurazione di due servizi che è destinata all'uso esclusivo dei system administrator. Essendo questi signori molto pigri è necessario per noi sviluppatori fargli fare tutto da una singola form, sennò si confondono (Se lo legge il sistemaio mi sistema per le feste e mi impedisce anche l'uso della tastiera :P). &lt;/p&gt;
&lt;p&gt;L'operazione che la DLL sconosciuta faceva consisteva nella modifica del flag di Startup del servizio, da Manuale ad Automatico e viceversa. Dato che questa DLL non funziona sul mio PC e non so se sia dovuto al fatto che è un XP al posto di un 2000 o 2003 server, oppure se è dovuto al framework 2.0 oppure semplicemente perché la DLL è rovinata, ho esposto la mia disperazione al forum, e Mario Raccagni che ringrazio di cuore, mi ha fornito una classe VB.NET che faceva qualcosa di simile utilizzando le API di windows. &lt;/p&gt;
&lt;p&gt;Visto che questo è un problema strano ma potrebbe accadere ad altri, ho pensato di rendere pubblica la classe che ho generato che al momento modifica solo il flag a me necessario, ma volendo, potrebbe essere utilizzata per fare diversi tipi di manipolazioni su un servizio installato.&lt;/p&gt;
&lt;pre class="CSharpFormat"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Using directives

&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;

&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ForYou.F2PConsole
{
    &lt;span class="rem"&gt;///&lt;/span&gt;
    &lt;span class="rem"&gt;/// Descrizione della classe: &lt;/span&gt;
    &lt;span class="rem"&gt;///&lt;/span&gt;
    &lt;span class="rem"&gt;///&lt;/span&gt;
    &lt;span class="rem"&gt;///&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ServiceConfigManager
    {
        &lt;span class="preproc"&gt;#region&lt;/span&gt; Variabili &lt;span class="kwrd"&gt;private&lt;/span&gt;

        &lt;span class="rem"&gt;///&lt;/span&gt;
        &lt;span class="rem"&gt;/// Nome della classe usato per debug nella generazione delle eccezioni&lt;/span&gt;
        &lt;span class="rem"&gt;///&lt;/span&gt;
        &lt;span class="rem"&gt;///&lt;/span&gt;
        &lt;span class="rem"&gt;///&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; mClassNameS = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.Name;

        [StructLayout(LayoutKind.Sequential)]
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;struct&lt;/span&gt; QUERY_SERVICE_CONFIG
        {
            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; dwServiceType;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; dwStartType;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; dwErrorControl;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; IntPtr pBinaryPathName;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; IntPtr pLoadOrderGroup;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; dwTagId;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; IntPtr pDependencies;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; IntPtr pServiceStartName;
            &lt;span class="kwrd"&gt;public&lt;/span&gt; IntPtr pDisplayName;
        } &lt;span class="rem"&gt;// QUERY_SERVICE_CONFIG&lt;/span&gt;

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SC_MANAGER_CONNECT = 1;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SERVICE_QUERY_CONFIG = 1;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SERVICE_CHANGE_CONFIG = 2;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; SERVICE_INTERACTIVE_PROCESS = 0x100;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ERROR_INSUFFICIENT_BUFFER = 122;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;uint&lt;/span&gt; SERVICE_NO_CHANGE = 0xFFFFFFFF;

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Queries the service config.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// The h service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// The p buffer.&lt;/span&gt;
        &lt;span class="rem"&gt;/// Size of the cb buf.&lt;/span&gt;
        &lt;span class="rem"&gt;/// The PCB bytes needed.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
    [DllImport(&lt;span class="str"&gt;"advapi32.dll"&lt;/span&gt;, EntryPoint=&lt;span class="str"&gt;"QueryServiceConfigW"&lt;/span&gt;, SetLastError=&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
           CharSet=CharSet.Unicode, ExactSpelling=&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
           CallingConvention=CallingConvention.StdCall)]
           &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; QueryServiceConfig(IntPtr hService,
       IntPtr pBuffer, &lt;span class="kwrd"&gt;int&lt;/span&gt; cbBufSize, &lt;span class="kwrd"&gt;out&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; pcbBytesNeeded);

           &lt;span class="rem"&gt;/// &lt;/span&gt;
           &lt;span class="rem"&gt;/// Changes the service config.&lt;/span&gt;
           &lt;span class="rem"&gt;/// &lt;/span&gt;
           &lt;span class="rem"&gt;/// The h service.&lt;/span&gt;
           &lt;span class="rem"&gt;/// Type of the dw service.&lt;/span&gt;
           &lt;span class="rem"&gt;/// Start type of the dw.&lt;/span&gt;
           &lt;span class="rem"&gt;/// The dw error control.&lt;/span&gt;
           &lt;span class="rem"&gt;/// Name of the p binary path.&lt;/span&gt;
           &lt;span class="rem"&gt;/// The p load order group.&lt;/span&gt;
           &lt;span class="rem"&gt;/// The PDW tag id.&lt;/span&gt;
           &lt;span class="rem"&gt;/// The p dependencies.&lt;/span&gt;
           &lt;span class="rem"&gt;/// Start name of the p service.&lt;/span&gt;
           &lt;span class="rem"&gt;/// The p password.&lt;/span&gt;
           &lt;span class="rem"&gt;/// Name of the p display.&lt;/span&gt;
           &lt;span class="rem"&gt;/// &lt;/span&gt;
    [DllImport(&lt;span class="str"&gt;"advapi32.dll"&lt;/span&gt;, EntryPoint=&lt;span class="str"&gt;"ChangeServiceConfigW"&lt;/span&gt;, SetLastError=&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
           CharSet=CharSet.Unicode, ExactSpelling=&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
           CallingConvention=CallingConvention.StdCall)]
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ChangeServiceConfig(IntPtr hService, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwServiceType,
        &lt;span class="kwrd"&gt;int&lt;/span&gt; dwStartType, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwErrorControl, IntPtr pBinaryPathName, IntPtr pLoadOrderGroup,
        &lt;span class="kwrd"&gt;int&lt;/span&gt; pdwTagId, IntPtr pDependencies, IntPtr pServiceStartName, IntPtr pPassword, IntPtr pDisplayName);

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Opens the SC manager.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the s machine.&lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the s database.&lt;/span&gt;
        &lt;span class="rem"&gt;/// The dw desired action.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
    [DllImport(&lt;span class="str"&gt;"advapi32.dll"&lt;/span&gt;, EntryPoint=&lt;span class="str"&gt;"OpenSCManagerW"&lt;/span&gt;, SetLastError=&lt;span class="kwrd"&gt;true&lt;/span&gt;,
            CharSet=CharSet.Unicode, ExactSpelling=&lt;span class="kwrd"&gt;true&lt;/span&gt;, CallingConvention=CallingConvention.StdCall)] 
       &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr OpenSCManager(&lt;span class="kwrd"&gt;string&lt;/span&gt; sMachineName, &lt;span class="kwrd"&gt;string&lt;/span&gt; sDatabaseName, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwDesiredAction );

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Opens the service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// The h SCM.&lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the s service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// The dw desired action.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
    [DllImport(&lt;span class="str"&gt;"advapi32.dll"&lt;/span&gt;, EntryPoint=&lt;span class="str"&gt;"OpenServiceW"&lt;/span&gt;, SetLastError=&lt;span class="kwrd"&gt;true&lt;/span&gt;, 
           CharSet=CharSet.Unicode, ExactSpelling=&lt;span class="kwrd"&gt;true&lt;/span&gt;, CallingConvention=CallingConvention.StdCall)]
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr OpenService(IntPtr hSCM, &lt;span class="kwrd"&gt;string&lt;/span&gt; sServiceName, &lt;span class="kwrd"&gt;int&lt;/span&gt; dwDesiredAction);

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Closes the service handle.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// The h SC handle.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
    [DllImport(&lt;span class="str"&gt;"advapi32.dll"&lt;/span&gt;, EntryPoint=&lt;span class="str"&gt;"CloseServiceHandle"&lt;/span&gt;, SetLastError=&lt;span class="kwrd"&gt;true&lt;/span&gt;,
           ExactSpelling=&lt;span class="kwrd"&gt;true&lt;/span&gt;, CallingConvention=CallingConvention.StdCall)]
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; CloseServiceHandle(IntPtr hSCHandle);

        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Legge la configurazione di avvio di un servizio&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the p service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetStartConfig(  &lt;span class="kwrd"&gt;string&lt;/span&gt; pServiceName )
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;int&lt;/span&gt; ret = 0;
                IntPtr hScm = OpenSCManager(&lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, SC_MANAGER_CONNECT);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (hScm.Equals(0))
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"OpenSCManager() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }

                IntPtr hService = OpenService(hScm, pServiceName, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
                &lt;span class="kwrd"&gt;if&lt;/span&gt;( hService.Equals(0) )
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"OpenService() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }
                IntPtr pBuffer=&lt;span class="kwrd"&gt;new&lt;/span&gt; IntPtr();
                &lt;span class="kwrd"&gt;int&lt;/span&gt; cbServiceConfig = 0;
                &lt;span class="kwrd"&gt;bool&lt;/span&gt; fResult = QueryServiceConfig(hService, pBuffer, cbServiceConfig, &lt;span class="kwrd"&gt;out&lt;/span&gt; cbServiceConfig);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (Marshal.GetLastWin32Error() != ERROR_INSUFFICIENT_BUFFER)
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"QueryServiceConfig() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }

                pBuffer = Marshal.AllocHGlobal(cbServiceConfig);
                fResult = QueryServiceConfig(hService, pBuffer, cbServiceConfig, &lt;span class="kwrd"&gt;out&lt;/span&gt; cbServiceConfig);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!fResult)
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"QueryServiceConfig() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }
                QUERY_SERVICE_CONFIG serviceConfig = 
                    (QUERY_SERVICE_CONFIG)Marshal.PtrToStructure(pBuffer, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(QUERY_SERVICE_CONFIG));
                ret = serviceConfig.dwStartType;

                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!pBuffer.Equals(0))
                {
                    Marshal.FreeHGlobal(pBuffer);
                } &lt;span class="rem"&gt;// if&lt;/span&gt;
                CloseServiceHandle(hService);
                CloseServiceHandle(hScm);

                &lt;span class="kwrd"&gt;return&lt;/span&gt; (ret);
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;" "&lt;/span&gt; + mClassNameS + &lt;span class="str"&gt;"."&lt;/span&gt;
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
        }

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Attiva l'avvio automatico di un servizio&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the p service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; SetStartConfigAutomatic(&lt;span class="kwrd"&gt;string&lt;/span&gt; pServiceName)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt;( SetStartConfig(pServiceName, 2));
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;" "&lt;/span&gt; + mClassNameS + &lt;span class="str"&gt;"."&lt;/span&gt;
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
        }

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Attiva l'avvio manuale per un servizio&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the p service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; SetStartConfigManual(&lt;span class="kwrd"&gt;string&lt;/span&gt; pServiceName)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt;( SetStartConfig(pServiceName, 3));
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;" "&lt;/span&gt; + mClassNameS + &lt;span class="str"&gt;"."&lt;/span&gt;
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
        }

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Disattiva l'avvio di un servizio&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the p service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; SetStartConfigDisable(&lt;span class="kwrd"&gt;string&lt;/span&gt; pServiceName)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt;( SetStartConfig(pServiceName, 4));
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;" "&lt;/span&gt; + mClassNameS + &lt;span class="str"&gt;"."&lt;/span&gt;
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }

        }

        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Predispone la modalità di avvio di un servizio&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="rem"&gt;/// Name of the p service.&lt;/span&gt;
        &lt;span class="rem"&gt;/// The p value.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; SetStartConfig(&lt;span class="kwrd"&gt;string&lt;/span&gt; pServiceName, &lt;span class="kwrd"&gt;int&lt;/span&gt; pValue)
        {
            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                IntPtr hScm = OpenSCManager(&lt;span class="kwrd"&gt;null&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;, SC_MANAGER_CONNECT);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (hScm.Equals(0))
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"OpenSCManager() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }

                IntPtr hService = OpenService(hScm, pServiceName, SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (hService.Equals(0))
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"OpenService() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }

                IntPtr pBuffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; IntPtr();
                &lt;span class="kwrd"&gt;int&lt;/span&gt; cbServiceConfig = 0;
                &lt;span class="kwrd"&gt;bool&lt;/span&gt; fResult = QueryServiceConfig(hService, pBuffer, cbServiceConfig, &lt;span class="kwrd"&gt;out&lt;/span&gt; cbServiceConfig);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (Marshal.GetLastWin32Error() != ERROR_INSUFFICIENT_BUFFER)
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"QueryServiceConfig() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }

                pBuffer = Marshal.AllocHGlobal(cbServiceConfig);
                fResult = QueryServiceConfig(hService, pBuffer, cbServiceConfig, &lt;span class="kwrd"&gt;out&lt;/span&gt; cbServiceConfig);
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!fResult)
                {
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;"QueryServiceConfig() failed with error "&lt;/span&gt; + Marshal.GetLastWin32Error());
                }
                QUERY_SERVICE_CONFIG serviceConfig =
                    (QUERY_SERVICE_CONFIG)Marshal.PtrToStructure(pBuffer, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(QUERY_SERVICE_CONFIG));

                fResult = ChangeServiceConfig(hService, serviceConfig.dwServiceType, pValue, serviceConfig.dwErrorControl,
                    serviceConfig.pBinaryPathName, serviceConfig.pLoadOrderGroup, serviceConfig.dwTagId,
                    serviceConfig.pDependencies, serviceConfig.pServiceStartName, IntPtr.Zero, serviceConfig.pDisplayName);

                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!pBuffer.Equals(0))
                {
                    Marshal.FreeHGlobal(pBuffer);
                } &lt;span class="rem"&gt;// if&lt;/span&gt;
                CloseServiceHandle(hService);
                CloseServiceHandle(hScm);
                &lt;span class="kwrd"&gt;return&lt;/span&gt;(fResult);
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationException(&lt;span class="str"&gt;" "&lt;/span&gt; + mClassNameS + &lt;span class="str"&gt;"."&lt;/span&gt;
                    + System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
            }
        }

    }
}
&lt;/pre&gt;
&lt;p&gt;Tags: &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/servizi/default.aspx"&gt;servizi&lt;/a&gt;, &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/configurazione/default.aspx"&gt;configurazione&lt;/a&gt;, &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/Dllimport/default.aspx"&gt;Dllimport&lt;/a&gt; , &lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/classi/default.aspx"&gt;classi&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/sabrina/aggbug/55.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sabrina C.</dc:creator>
            <guid>http://community.dotnetwork.it/sabrina/archive/2008/03/24/accedere-e-modificare-le-proprietagrave-di-un-servizio-storico.aspx</guid>
            <pubDate>Mon, 24 Mar 2008 16:51:26 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/sabrina/comments/55.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/sabrina/archive/2008/03/24/accedere-e-modificare-le-proprietagrave-di-un-servizio-storico.aspx#feedback</comments>
            <wfw:commentRss>http://community.dotnetwork.it/sabrina/comments/commentRss/55.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Errore 193 0xc1 Avviando un servizio (Storico)</title>
            <link>http://community.dotnetwork.it/sabrina/archive/2008/03/24/errore-193-0xc1-avviando-un-servizio.aspx</link>
            <description>&lt;p&gt;Mi ci sono imbattuta nelle mie prove e test per la presa in carico di un progetto non mio, una delle cose che ho fatto per portare il progetto dal codice scritto in modo "selvaggio" (senza commenti e con il minimo uso dell'OOP) agli standard interni che ci siamo dati in azienda, è quello di togliere tutto il codice dall'interno del progetto del servizio lasciandovi solo gli entry point, in questo modo, le funzionalità svolte dal servizio possono essere testate utilizzando una applicazione windows normale oppure gli UnitTest, e per  testare il servizio non è necessario fare alcun tipo di debug, visto che fa solo uno start e instanzia un oggetto oppure uno stop e cestina l'oggetto. &lt;/p&gt;
&lt;p&gt;Mentre facevo questo, semplicemente buttando via il vecchio servizio e generandone uno equivalente, mi sono imbattuta in questo strano errore di avvio, questo errore, è causato dal fatto che, nella mia furia estrattiva, avevo tolto dal progetto del servizio la classe contenente il project installer mettendola su una diversa DLL, credendo erroneamente che l'installer prendesse l'assembly del mio servizio, di cui gli davo il nome e lo installasse indipendentemente da dove questo fosse situato. Invece, a ragione, l'installer utilizza l'assembly dove si trova e non uno esterno, pertanto, estrarre il codice va bene, ma l'installer è necessario resti dentro l'eseguibile del progetto altrimenti Errore 193 0xc1. &lt;/p&gt;
&lt;p&gt;Oltre a questo, avevo commesso un'altro errore, infatti, il nome della classe del servizio non è uguale al nome del servizio (questa è stata una scelta effettuata alle origini su cui non indago) per cui, avendo dato all'installer un nome mentre il servizio ne aveva uno diverso, di qui l'errore 193 0xc1. &lt;/p&gt;
&lt;p&gt;Perché bloggare questa sciocchezza ed espormi al generale ludibrio per la mia pochezza di programmatore? &lt;br /&gt;
Perché su google ho trovato 10000 richieste su cosa potesse essere questo errore, e nessuna risposta. Quindi spero che qualcuno incappando nel mio stesso errore possa beneficiarne. &lt;/p&gt;
&lt;p&gt;(2006)&lt;/p&gt;
&lt;p&gt;Tags:&lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/servizi/default.aspx"&gt;servizi&lt;/a&gt;,&lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/errori/default.aspx"&gt;errori&lt;/a&gt;,&lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/avvio/default.aspx"&gt;avvio&lt;/a&gt;,&lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/installer/default.aspx"&gt;installer&lt;/a&gt;,&lt;a rel="tag" href="http://community.dotnetwork.it/Sabrina/Tags/classi/default.aspx"&gt;classi&lt;/a&gt;&lt;/p&gt;&lt;img src="http://community.dotnetwork.it/sabrina/aggbug/47.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Sabrina C.</dc:creator>
            <guid>http://community.dotnetwork.it/sabrina/archive/2008/03/24/errore-193-0xc1-avviando-un-servizio.aspx</guid>
            <pubDate>Mon, 24 Mar 2008 08:10:42 GMT</pubDate>
            <wfw:comment>http://community.dotnetwork.it/sabrina/comments/47.aspx</wfw:comment>
            <comments>http://community.dotnetwork.it/sabrina/archive/2008/03/24/errore-193-0xc1-avviando-un-servizio.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://community.dotnetwork.it/sabrina/comments/commentRss/47.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
