Lettura Registro tra Servizio e applicazione Form

di il
9 risposte

Lettura Registro tra Servizio e applicazione Form

Salve

Sto Implementado un servizio che allo start deve leggere una stringa dal registro impostata da un applicativo WinForm


Sotto quale chiave di registro e' meglio operare per aver la possibilita di legge e scrivere valori sia dal servizio che dall'applicativo WinForm?

9 Risposte

  • Re: Lettura Registro tra Servizio e applicazione Form

    ... in realtà... nessuna.
    Più stai lontano dal registro Windows, meglio è
  • Re: Lettura Registro tra Servizio e applicazione Form

    MircoSoft ha scritto:


    Sotto quale chiave di registro e' meglio operare per aver la possibilita di legge e scrivere valori sia dal servizio che dall'applicativo WinForm?
    Puoi creare una chiave principale con questa alberatura:
    HKEY_CURRENT_USER\SOFTWARE\NomeAzienda\NomeProdotto

    Ovviamente, sostituisci NomeAzienda e NomeProdotto con i tuoi riferimenti.

    All'interno della chiave NomeProdotto, puoi tranquillamente creare tutte le sottochiavi e i valori che vuoi.

    Essendo che la chiave principale è HKEY_CURRENT_USER, le impostazioni che leggi/scrivi valgono per il profilo dell'utente corrente, quindi ogni utente potenzialmente avrà la propria configurazione.

    Per quanto riguarda l'uso in Delphi, usa la classe TRegistry, che immagino però tu conoscia già.
    Nella documentazione trovi anche dei progetti di esempio con sorgente.

    Ciao!
  • Re: Lettura Registro tra Servizio e applicazione Form

    Credo sia un problema di differente utente.. ma all'interno del servizio stesso...

    Mi spiego meglio:

    All'interno di "ServiceAfterInstall" richiamo un Form per impostare una chiave di attivazione funzioni

    puntando in "Computer\HKEY_CURRENT_USER\SOFTWARE\NomeAzienda\NomeProdotto\LicenceNumber"

    e fin qui tutto bene


    All'interno di "ServiceStart" vorrei recuperare la chiave scritta prima
    ma facendo un test di scrittura mi sono ritrovato la chiave di test in questi punti:

    "Computer\HKEY_USERS\.DEFAULT\Software\NomeAzienda\NomeProdotto\LicenceNumber"
    "Computer\HKEY_USERS\S-1-5-18\Software\NomeAzienda\NomeProdotto\LicenceNumber"
    "Computer\HKEY_USERS\S-1-5-21-354774835-3453852919-2670249687-1001\SOFTWARE\NomeAzienda\NomeProdotto\LicenceNumber"


    In che punto dovrei scrivere per poi ritrovarlo?
  • Re: Lettura Registro tra Servizio e applicazione Form

    MircoSoft ha scritto:


    All'interno di "ServiceStart" vorrei recuperare la chiave scritta prima
    ma facendo un test di scrittura mi sono ritrovato la chiave di test in questi punti
    [...]
    Non so come hai fatto a scrivere in quelle locazioni, visto che in fondo il funzionamento e l'uso del Registro è cosa abbastanza banale... ma senza codice, non posso dirti nulla.
  • Re: Lettura Registro tra Servizio e applicazione Form

    Aggiungo qualche P.S....

    MircoSoft ha scritto:


    All'interno di "ServiceAfterInstall" richiamo un Form per impostare una chiave di attivazione funzioni
    Attenzione a non usare elementi visuali, tipo Form, su una ServiceAfterInstall: se parliamo di Windows Services, ossia dei servizi gestiti tramite SCM (Service Control Manager) o più in generale di "servizi Windows" (che appaiono nello snap-in "Servizi" degli strumenti avanzati di configurazione), questi generalmente non sono applicativi dotati di una interfaccia utente.

    L'installazione di un servizio ma sopratutto la sua esecuzione normalmente possono avvenire anche all'avvio della macchina, in automatico, senza che l'utente faccia il login: sono fatti apposta per questo.

    Da questo punto di partenza, si evincono altri problemi.

    MircoSoft ha scritto:


    puntando in "Computer\HKEY_CURRENT_USER\SOFTWARE\NomeAzienda\NomeProdotto\LicenceNumber"
    e fin qui tutto bene
    Fin qui tutto bene "nì", perché il servizio - come detto sopra - può essere lanciato senza fare riferimento a un utente specifico, e allora non puoi usare la HKEY_CURRENT_USER (o una cartella del profilo utente, se fosse una directory contenente file di dati), a meno di non configurare il servizio affinché giri con quel profilo utente tramite l'interfaccia SCM stessa, andando a modificare le opzioni di avvio, l'utente di riferimento e tutte le altre condizioni.

    A questo punto, usa la chiave HKLM (HKEY_LOCAL_MACHINE) per memorizzare le impostazioni, ossia una chiave che può essere letta/scritta a prescindere dall'utente collegato e raggiungibile senza una configurazione particolare.

    MircoSoft ha scritto:


    All'interno di "ServiceStart" vorrei recuperare la chiave scritta prima
    ma facendo un test di scrittura mi sono ritrovato la chiave di test in questi punti [...]
    Spero che la scrittura non venga effettuata dal servizio contestualmente alla lettura delle chiavi, ad ogni modo vale quanto già detto sopra.

    MircoSoft ha scritto:


    In che punto dovrei scrivere per poi ritrovarlo?
    Modifica il codice in base alle indicazioni fornite ed eventualmente, in caso di persistenza di problemi, postalo sul forum per esaminarlo con i relativi dettagli.

    Ciao!
  • Re: Lettura Registro tra Servizio e applicazione Form

    Grazie della risposta

    In effettei la chiamata al Form mi e' permessa solo dall'AfterInstall (da ServiceStart non e' permessa)
    La Scelta di farla era dovuto solo a comodita' e verrebbe fatta solo una volta al momento dell'installazione
    quindi potrei creare un applicativo di configurazione da utilizzare solo la prima volta


    Il recupero in ServiceStart e' invece inidispensabile per valutare la chiave di attivazione e la configurazione di esecuzione
    
    ''###############################################
    '//#Codice in ServiceAfterInstall
    ''###############################################
        CoInitialize(nil);
          bLicenceFound := False;
    
          sCodeNum := '';
          sApplicationName  := StringReplace(ExtractFileName(Application.ExeName), '.exe', '', [rfReplaceAll]);
          Reg := TRegistry.Create();
          Reg.RootKey := HKEY_CURRENT_USER; 
          if Reg.OpenKey('SOFTWARE\NomeAzienda\' + sApplicationName + '\LicenceNumber', True) then
          begin
            sCodeNum := Reg.ReadString('LicenceNumber');
            bLicenceFound := CheckLicence; 
          end;
          Reg.Free;
          if not bLicenceFound then
          begin
            //#Licenza NON Trovata!!!
            frmInsertLicence := TfrmInsertLicence.Create(Self);
            frmInsertLicence.ShowModal;
            frmInsertLicence.Free;
          end;
        CoUninitialize;
    
    ''###############################################
    '//#Codice in WinFrom
    ''###############################################
        bLicenced :=  True; //#Temporaneo Mirco
        sLicence := Trim(edtCodiceLicenza.Text);
        if (Length(sLicence) >= LICENCE_LEN) then
        begin
          sCodeNum := DecodenumCode(sLicence);
          if (GetMacAdress[0] = DecodeMac(sCodeNum)) then
          begin
            sApplicationName  := StringReplace(ExtractFileName(Application.ExeName), '.exe', '', [rfReplaceAll]);
            Reg := TRegistry.Create;
              Reg.RootKey := HKEY_CURRENT_USER; 
              Reg.OpenKey('SOFTWARE\NomeAzienda\' + sApplicationName + '\LicenceNumber', True);
              Reg.WriteString('LicenceNumber', sLicence);
              Reg.WriteString('TestScrittura', 'Sto Scrivendo Qui');
              bLicenced :=  True;
      		FreeAndNil(Reg);
      	  end;
      	end;
      	
    ''###############################################
    '//#Codice in ServiceStart
    ''###############################################
    	sCodeNum := '';
        sApplicationName  := StringReplace(ExtractFileName(Application.ExeName), '.exe', '', [rfReplaceAll]);
        Reg := TRegistry.Create;
        Reg.RootKey := HKEY_CURRENT_USER; 
        if Reg.OpenKey('SOFTWARE\NomeAzienda\' + sApplicationName + '\LicenceNumber', False) then
        begin
          sCodeNum := Reg.ReadString('LicenceNumber');
      	  Reg.WriteString('TestLettura', 'Sto Leggendo Qui');	
      	end;
      	FreeAndNil(Reg);
    
    Avevo provato anche con HKEY_LOCAL_MACHINE ma mi dava errori in scrittura
    Riprovero'
  • Re: Lettura Registro tra Servizio e applicazione Form

    MircoSoft ha scritto:


    In effettei la chiamata al Form mi e' permessa solo dall'AfterInstall (da ServiceStart non e' permessa)
    Nei servizi non dovrebbe esserci l'ombra di alcun Form: al massimo usi una applicazione tradizionale.
    I servizi non devono interagire con il desktop salvo casi particolari e specifici.

    MircoSoft ha scritto:


    La Scelta di farla era dovuto solo a comodita' e verrebbe fatta solo una volta al momento dell'installazione
    quindi potrei creare un applicativo di configurazione da utilizzare solo la prima volta
    Integra la scrittura della chiave e l'eventuale Form di richiesta nel processo di installazione, oppure predisponi un tool apposito da invocare all'occorrenza che sia in grado di farlo e testarlo.

    MircoSoft ha scritto:


    Il recupero in ServiceStart e' invece inidispensabile per valutare la chiave di attivazione e la configurazione di esecuzione
    Sì, ma la OpenKey non dovresti farla usando il parametro CanCreate a True, altrimenti ti viene creata in automatico, non ha i valori che ti aspetti e comunque utilizza una radice non corretta.

    MircoSoft ha scritto:


    Avevo provato anche con HKEY_LOCAL_MACHINE ma mi dava errori in scrittura
    La scrittura richiede privilegi più elevati: se la chiave viene creata dal setup, errori in scrittura non ce ne sono, perché generalmente gira con privilegi maggiori delle applicazioni.

    Se la chiave viene creata dal servizio all'avvio, allora sì che la scrittura viene bloccata.

    Scrivi in HKLM in fase di instazione, e leggi da HKLM in fase di avvio del servizio (senza scrivere necessariamente).

    Ciao!
  • Re: Lettura Registro tra Servizio e applicazione Form

    Risolto con HKEY_LOCAL_MACHINE


    Grazie mille
  • Re: Lettura Registro tra Servizio e applicazione Form

    MircoSoft ha scritto:


    Risolto con HKEY_LOCAL_MACHINE
    Ottimo!
Devi accedere o registrarti per scrivere nel forum
9 risposte