понедељак, 26. септембар 2016.

Čitanje i pisanje u bazu Registry


Zahvaljujući .Net Framework okruženju, zbog čega su trenutno sklopovi potpuno samodovoljni, tako da se ni jedna informacija o sklopu ne mora da čuva u bazi Registry; zatim zbog koncepta izolovanog skladištenja po kome se aplikacije u datotekama mogu čuvati informacije specifične za svakog korisnika i činjenica da .Net Framework obezbeđuje da se podaci smeštaju odvojeno za sve korisnike koji su registrovani na računaru, vi faktički i nemate potrebe da čitate i upisujete informacije u bazu Registry. Međutim, ukoliko pravite komercijalnu aplikaciju; verovatno će te samo neke određene informacije npr. o konfiguraciji vaše aplikacije čuvati u bazi Registry. Ili ako želite da se vaša aplikacija pojavljuje u dijalogu Add/Remove Programs u Control Panel-u, tada će te formatirati odgovarajuće odrednice u bazi Registry. Pre pojave .Net Framework su se skoro sve stvari vezane za vašu aplikaciju upisivale u bazu Registry; čak i na primer pozicija i boja Windows Form-e prilikom otvaranja vaše aplikacije. Danas se to ne radi.

 
( Registry Editor u Windows 10 operativnom sistemu )

U bazu Registry se uglavnom upisuju informacije o korisniku, hardveru, konfiguraciji i informacijama o instaliranim aplikacijama u vašem računaru. Definitivno se ne koristi za čuvanje šifri iako su Registry ključevi zaštićeni ACL - Access Control Lists. Inače baza Registry ima hijerarhijsku strukturu i za pregledanje i menjanje sadržaja obično se koristi regedit ili regedt32 uslužni program. Važno je napomenuti da bilo kakav rad sa bazom Registry zahteva od vas da napravite backup baze Registry kako ne biste načinili neku štetu vašem operativnom sistemu. Jednostavno ukucajte regedit u dijalogu Run vašeg Windows-a ili pitajte Cortana-u i na taj način će te otvoriti Registry Editor. Idite na File zatim Export… i možete kreirati backup vaše Registry baze. U principu backup Registry baze podataka vam je jednostavna tekstualna datoteka sa egzistencijom *.reg koju posle možete ponovo da importujete ukoliko ste nešto zabrljali. To nije naravno uvek slučaj jer ako na primer izbrišete neki bitan ključ vašeg operativnog sistema moraćete pokrenuti Recovery celog operativnog sistema sa vašeg instalacionog Windows diska.

Od čega se sastoji baza Registry?


Kao što možete videti na slici Registry Editor-a; korisnički interfejs je jednostavan i informacije prikazuje u hijerarhijski u TreeView kontroli. I pored toga što vi možete videti samo 5 čvorova na najvišem nivou preko uslužnog programa regedit, čvorova u stvari postoji 7. Njih zamislite poput particija diska s time što nije moguće promeniti grupe ključeva koje postoje u bazi. Jednostavno najviši čvorovi baze Registry su fiksni.
  • HKEY_CLASSES_ROOT (HKCR) – sadrži detalje o tipovima datoteka u sistemu, o njihovim egzistencijama koje možete otvarati u računaru ali i registracione informacije za sve COM komponente. Obično zbog Windows-a ova grupa ključeva baze zauzima najveći deo baze.
  • HKEY_CURRENT_USER (HKCU) – sadrži detalje o podešavanjima sistema za korisnika koji je trenutno prijavljen na sistem.
  • HKEY_LOCAL_MACHINE (HKLM) – sadrži detalje o ukupnom softveru i hardveru instaliranom na vašem računaru. Ova velika grupa ključeva takođe obuhvata i HKCR jer HKCR nije nezavisna samostalna grupa već predstavlja pogodno mapiranje na ključ HKLM/Software/Classes.
  • HKEY_USERS (HKUSR) – sadrži detalje o podešavanjima sistema za sve korisnike. Ova grupa obuhvata HKCU grupu koja je samo mapiranje na jedan od ključeva u grupi HKEY_USERS.
  • HKEY_CURRENT_CONFIG (HKCF) – sadrži detalje o hardveru vašeg računara.
Preostale dve grupe ključeva koje ne vidite su promenjive i često se menjaju:
  • HKEY_DYN_DATA – sadrži mesto za smeštanje svih privremenih podataka koji se moraju čuvati negde u bazi Registry.
  • HKEY_PERFOMANCE_DATA – sadrži informacije koje se odnose na performanse aplikacija koje se izvršavaju.
Za razliku od foldera u File Explorer-u gde folder sadrži i druge datoteke i foldere; u bazi Registry se pišu samo ključevi. Ključ može sadržavati podatke ili druge ključeve. Ako ključ sadrži podatke, tada je to predstavljeno nizom vrednosti; dok se vrednost sastoji od ime vrednosti, tip vrednosti i konkretan podatak vrednosti. Može vam zvučati čudno, ali ključ može imati podrazumevanu vrednost koja nije imenovana ili može postojati ključ koji nema vrednost. Ponekad samo prisustvo ključa pruža dovoljno informacija za aplikaciju. Ali najvažnije je da shvatite da u bazi Registry postoje samo 3 tipa ključa i da oni nisu isto što i tipovi promenjivih u  .Net Framework. I to su:
  • REG_SZ - je tip podataka koji odgovara promenjivoj tipa String.
  • REG_DWORD – je tip podataka koji odgovara tipu UInt.
  • REG_BINARY – je tip podataka koji odgovara nizu bajtova.
Ukoliko vi želite da čuvate neke podatke u bazi Registry, to možete ostvariti formatiranjem više ključeva. Sad kad znate kako funkcioniše baza Registry, onda nam je lakše razumeti i kako se radi sa Registry bazom na programerski način.

Kako da radimo sa Registry bazom koristeći C# programski jezik?

Najbolji način da vidite kako se sa C# programskim jezikom radi sa Registry bazom jeste da pogledate praktičan primer istog. Ali pre toga želim da vam napomenem da sa radom sa bazom Registry vi koristite samo dve klase Registry i RegistryKey. Ukoliko savladate samo ove dve navedene klase, vama programerski rad sa Registry bazom će uvek biti jednostavan. Još hoću da vas posavetujem da iz bezbednosnih razloga uvek je bolje praviti ključeve u Microsoft.Win32.Registry.CurrentUser nego u Microsoft.Win32.Registry.LocalMachine. Rad sa Registry bazom nije toliko komplikovan koliko bi ste na prvi pogled pomislili. Pogledajte praktični primer i obratite pažnju na kod koji upisuje, čita i briše iz baze Registry:

using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;

namespace WindowsRegistry
{
    class Program
    {
        static void Main(string[] args)
        {
            string subKey = @"SOFTWARE\MYAPPLICATION";

            WriteLine("WINDOWS REGISTRY" + Environment.NewLine);

            WriteLine("Write into the registry..." + Environment.NewLine);
            WriteLine("Write the first key -> NAME: Manuel Radovanovic");

            WriteIntoRegistry("NAME", "Manuel Radovanovic", subKey);

            WriteLine(@"Write the second key -> BLOG: http:\\www.manuelradovanovic.com");

            WriteIntoRegistry("BLOG", @"http:\\www.manuelradovanovic.com", subKey);

            WriteLine(Environment.NewLine + new String('-', 20) + Environment.NewLine);

            WriteLine("Read values from the registry..." + Environment.NewLine);

            WriteLine("NAME: " + ReadFromRegistry("NAME", subKey));
            WriteLine("BLOG: " + ReadFromRegistry("BLOG", subKey) + Environment.NewLine);

            DeleteRegistryKey(subKey);

            WriteLine(Environment.NewLine + "Press any key to continue...");
            ReadKey();

        }

        static string ReadFromRegistry(string keyName,string subKey)
        {
            RegistryKey sk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(subKey);

            if (sk == null) return null; else return sk.GetValue(keyName.ToUpper()).ToString();
           
        }

        static void WriteIntoRegistry(string keyName, string value, string subKey)
        {
            RegistryKey sk = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(subKey);

            sk.SetValue(keyName.ToUpper(), value);

        }

        static void DeleteRegistryKey(string subKey)
        {
            Write("Delete registry key? (Y/N) ");
            if (Char.ToUpper(Convert.ToChar(Console.Read())) == 'Y')
            {
                Registry.CurrentUser.DeleteSubKeyTree(subKey);
                WriteLine(Environment.NewLine + $"Registry key {subKey} deleted.");

            }
        }
    }
}

Kad pokrenete navedeni program dobićete sledeći rezultat. Međutim, pre nego što odaberete opciju da izbrišete ključ iz baze Registry; pogledajte preko regedit alata ključ koji ste kreirali. Zatim se vratite u program i potvrdite brisanje ključa.

WINDOWS REGISTRY

Write into the registry...

Write the first key -> NAME: Manuel Radovanovic
Write the second key -> BLOG: http:\\www.manuelradovanovic.com 


--------------------

Read values from the registry...

NAME: Manuel Radovanovic
BLOG: http:\\www.manuelradovanovic.com

Delete registry key? (Y/N) y

Registry key SOFTWARE\MYAPPLICATION deleted.

Press any key to continue...


Kako izgleda navedeni program možete pogledati i na video-u:


( C# 6.0 Tutorial - Advanced - 51. Read And Write Into The Windows Registry )