mercoledì 14 novembre 2012

[GUIDA] Eseguire programmi all'avvio di Windows modificando il registro (in C e non)

Supponiamo che necessitiate che un programma sia subito disponibile non appena avviate Windows. Quello che dovete fare è aggiungere quel programma alla lista di quelli che il sistema operativo carica automaticamente quando l'utente si logga. Esistono vari metodi per farlo, io ve ne mostrerò due. Uno che va bene per chiunque, l'altro che va bene per chi sa programmare. In tutti e due andremo a modificare il registro di sistema.







Metodo 1 (per tutti)


Facciamo questo esperimento per arrivare subito al dunque. Andate sul desktop e create un nuovo file di testo. Chiamatelo come volete (io lo chiamo "ciao.txt") e scriveteci dentro qualcosa. Poi salvatelo e chiudete. Supponiamo che questo sia il vostro programma che volete che venga eseguito in automatico all'avvio.
Cliccate su Start e digitate "regedit", poi premete Invio. Vi si aprirà il famoso registro di sistema.
NOTA: per chi non lo sapesse il registro è di fondamentale importanza per la salute di Windows. Una modifica sbagliata potrebbe compromettere il sistema, quindi occhio a quello che toccate!
Ora dovrete continuare ad aprire tutte le cartelle organizzate a menù a tendina che vedete sulla destra, effettuando questo percorso:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
per i sistemi Windows a 64bit, però, il percorso invece è:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
ad ogni modo se vedete che in una delle due c'è poca roba o le cose non vi tornano provate con l'altra. 
Una volta trovato e raggiunto il percorso cliccate con il destro nella parte delstra della finestra, quella con tutte le chiavi e i valori per intenderci ed andate ad aggiungere un nuovo valore: Nuovo-> Valore stringa. Ora date come nome il nome del vostro programma (io ho scritto "Ciao"). Poi. cliccate sulla nuova stringa aggiunta e nel campo "dati valore" scrivete il percorso del file da avviare (nel mio caso "C:\Users\Malo\Desktop\ciao.txt").
Chiudete e provate a disconnettervi e poi riconnettervi al sistema e dovreste vedere notepad che si avvia mostrandovi quello che avete scritto.
Per annullare le modifiche basta tornare nel registro ed eliminare la stringa che avete aggiunto.
Facile no? Per dubbi, commentate!

Metodo 2 (per chi è un po' più esperto)


Quello che faremo è creare un piccolo script in C che sfrutti le API Windows per fare in automatico tutto il procedimento visto nel primo metodo. Creremo cioè un programmino che aggiunga una chiave di registro contenente il programma che vogliamo avviare.
Lo scritpt è il seguente:

#include <stdio.h>
#include <windows.h>

int main()
{
    HKEY hKey;
    LONG err;
    char valore[50]="C:\\Users\\Malo\\Desktop\\ciao.txt";

    err = RegCreateKeyEx (HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);

    if (err == ERROR_SUCCESS)
    {
        RegSetValueEx(hKey, "Ciao", 0, REG_SZ, (LPBYTE)valore, sizeof(valore));
        printf("Nuovo valore stringa inserito con successo!");
        RegCloseKey (hKey);
    }
    else printf("Errore durante la chiamata RegCreateKeyEx.");
}

cosa abbiamo fatto?
Abbiamo chiamato la funzione  RegCreateKeyExche crea una chiave di registro se questa non esiste. Se invece esiste, come nel nostro caso, semplicemente vi accede. La chiamata ritorna ERROR_SUCCESS se ha successo, quindi nel caso ce l'abbia andiamo ad inserire la nuova stringa valore tramite la chiamata RegSetValueEx.
NOTA BENE : ricordatevi che lo script è da eseguire con i privilegi di admin sennò non verrà scritto un bel niente!
Non vi resta che compilare, eseguire e verificare che la chiave ci sia!
Facile no? Per dubbi, commentate!

2 commenti:

  1. Io non ho capito una cosa, volevo chiedere in che file scrive questa stringa di testo ("Nuovo valore stringa inserito con successo!") e anche quella dopo else ("Errore durante la chiamata RegCreateKeyEx.")
    Perchè io come file da mettere nel registro volevo inserire un .exe e quindi non vorrei che tentasse di editare il .exe
    Grazie e bellissime le tue guide ;)

    RispondiElimina
    Risposte
    1. Ciao, le due stringhe in questione vengono stampate da una printf, che è una chiamata di funzione la quale stampa a video una stringa. Di conseguenza non preoccuparti, sono solo due avvisi che appaiono sullo schermo (o meglio, sulla finestra del prompt) per controllare che sia andato tutto bene. Non viene toccato nessun file ;)

      Elimina