Prije dvije godine jednostavno me pitanje iz Pitanja i odgovora potaknulo da izradim skriptu za “dokaz koncepta”. izvoz svih BitLocker ključeva sigurnosno kopiran na Entra ID. Scenarij temelji se na Graph SDK-u za PowerShell i također se može pokrenuti za generiranje izvješća usmjerenog na uređaj, s bilo kojim povezanim ključem za oporavak BitLockera navedenim pored objekta uređaja.
Jedna od stvari koja mi je uvijek smetala u ovom primjeru skripte i mnogim sličnim uzorcima koda koji se nalaze na internetu jest činjenica da su BitLocker ključevi prikazani u običnom tekstu. Nije baš siguran pristup. Pa sam napokon morao ažurirati skriptu da bolje upravlja njome, koristeći SecureString objekte umjesto toga. I napravio nekoliko drugih poboljšanja u međuvremenu. Udubimo se.
Prije svega, nabavite svoju kopiju “V2” verzija skripte iz mog GitHub repoa. Budući da skripta koristi dopuštenja delegata, morate je pokrenuti s admin korisnikom, pogledajte službena dokumentacija za popis podržanih uloga. Također ćete trebati Graph API dozvole, kako slijedi:
- BitLockerKey.Read.All – potrebno za čitanje BitLocker ključeva za oporavak
- Uređaj.Pročitaj.Sve – izborno, potrebno za čitanje informacija o uređaju, ako želite da se izlazu dodaju dodatna svojstva
- User.ReadBasic.All – potrebno za “razrješavanje” vlasnika uređaja, ako želite da se doda u izlaz
Skripta će pokušati otkriti izvodi li se s potrebnim dopuštenjima, ali provjera nije dovoljno pametna da otkrije scenarije u kojima već imate dodane “šire” opsege, tj. Imenik.Pročitaj.Sve. Slobodno ažurirajte relevantni kod kako smatrate prikladnim (redci 178-191). Slično, ako želite pokrenuti skriptu bez nadzora, putem dopuštenja aplikacije, ažurirajte liniju 195 da biste koristili relevantne parametre.
Jedan scenarij koji prethodna verzija skripte nije obradila je kada je objekt uređaja dodan u administrativnu jedinicu s ograničenim upravljanjem (RMAU). Za takve je uređaje ključ za oporavak BitLockera izložen samo korisnicima s ograničenim dopuštenjima za predmetni RMAU, bez obzira na bilo kakve dodjele uloga na razini zakupca. Iako skripta još uvijek ne može dohvatiti takav ključ, gracioznije će rukovati objektima ograničenim RMAU-om.
Nakon što se pristupni token s potrebnim dopuštenjima uspješno dobije, skripta će dohvatiti sve BitLocker ključeve pronađene u vašem Entra ID zakupcu. Da bi dohvatio stvarnu vrijednost ključa za oporavak, tada će iterirati svaki pronađeni unos ključa. Dok bi u teoriji Graph SDK za PowerShell trebao upravljati prigušivanjem, mogli biste naići na probleme u tom trenutku ako imate tisuće ključeva sigurnosno kopiranih. Kako bi se ublažili neki od problema povezanih s prigušivanjem, uvedena je mala odgoda (linija 297). Slobodno ga ažurirajte na prikladniju vrijednost ili bolju kontrolu prigušivanja.
Jedini drugi Graph API poziv koji skripta čini je dohvaćanje svih objekata uređaja, što se događa samo kada ga pokrenete s jednim od odgovarajućih parametara. Kad smo već kod toga, evo cijelog skupa parametara koje podržava ova verzija skripte:
- IncludeDeviceInfo – izborno, koristite ga za dohvaćanje pojedinosti o uređaju. Zahtijeva Uređaj.Pročitaj.Sve dozvole.
- IncludeDeviceOwner – izborno, koristite ga za dohvaćanje UPN-a vlasnika uređaja. Zahtijeva User.ReadBasic.All dozvole.
- DeviceReport – izborno, prebacuje formatiranje izlaza na izvješće usmjereno na uređaj. Zahtijeva sve gore navedene dozvole.
- AllowInsecureOutput – izborno, generira izlaz običnog teksta uz sigurni XML (pogledajte dolje).
- Ulazna datoteka – koristi se za “dešifriranje” sigurnog prikaza niza BitLocker ključeva za oporavak u prethodno generiranoj izlaznoj datoteci (pogledajte dolje).
Evo nekoliko primjera kako pokrenuti skriptu. Prema zadanim postavkama (kada ga pokrenete bez ikakvih parametara), vratit će se samo minimalni izlaz. Za uključivanje pojedinosti uređaja u izlaz, upotrijebite –IncludeDeviceInfo prekidač. Da biste uključili UPN vlasnika uređaja, upotrijebite –IncludeDeviceOwner prekidač (koji se automatski prebacuje –IncludeDeviceInfo kao). A ako želite ispisati (uglavnom) sve pojedinosti o uređaju i izraditi izvješće usmjereno na uređaj, upotrijebite –DeviceReport prekidač.
#Get list of BitLocker recovery keys and their values .\GraphSDK_Bitlocker_reportV2.ps1 #Include data about the device .\GraphSDK_Bitlocker_reportV2.ps1 -IncludeDeviceInfo #Also include data about the device's owner .\GraphSDK_Bitlocker_reportV2.ps1 -IncludeDeviceInfo -IncludeDeviceOwner #Generate a report of all devices, with any associated BitLocker recovery keys included .\GraphSDK_Bitlocker_reportV2.ps1 -DeviceReport
Uključena su dva nova parametra za rukovanje izlazom. Prema zadanim postavkama, skripta će generirati XML datoteku, što je izvorni način pohranjivanja sigurnih nizova. Prikaz BitLocker ključa za oporavak pohranjen na takav način bit će dostupan samo trenutnom korisniku i trenutnom uređaju. Ali ovaj pristup stvara neke probleme kada zapravo želite dobiti nešifraranu vrijednost ključa. Da biste pomogli u tome, pokrenite skriptu s -Ulazna datoteka parametar i pokažite na lokaciju XML datoteke:
#Generate the report (keys are scrambled) .\GraphSDK_Bitlocker_reportV2.ps1 -DeviceReport #Unscramble the keys from an existing output file .\GraphSDK_Bitlocker_reportV2.ps1 -InputFile .\2026-03-13_12-28-55_BitLockerKeys.xml
Skripta će uzeti sadržaj XML datoteke kao ulaz i generirati CSV i HTML datoteke sa svim relevantnim detaljima i nešifriranim ključevima za oporavak BitLockera. Nema Graph API poziva kada pokrenete skriptu na ovaj način, jer jednostavno koristimo postojeće podatke i ConvertFrom-SecureString cmdlet. Alternativno, skriptu možete dot-source kako biste iskoristili odgovarajuće Generate-HTMLReport funkcija.
Na kraju, ako vjerujete da je sve ovo jednostavno nepotrebno, možete koristiti -AllowInsecureOutput promijenite izlaz skripte u “nekodirani” format, sa svim generiranim artefaktima koji prikazuju ključeve za oporavak BitLockera u običnom tekstu. Ovaj pristup je dobar za scenarije u kojima se planirate odmah riješiti izlaznih datoteka ili ih osigurati na bilo koji drugi način. Ali nemojte reći da vas nisam upozorio na pohranjivanje BitLocker ključeva u običnom tekstu!
Evo nekoliko primjera kako izgleda izlaz skripte. Počinjemo s XML datotekom, koja uvijek ima ključeve u njihovom kodiranom obliku. Ispod je uzorak izlaza “izvješća uređaja” s istaknutim kodiranim ključem za oporavak BitLockera i većinom dostupnih atributa skraćenih radi sažetosti:
Evo kako izgleda HTML izvješće generirano na temelju iste XML datoteke. Obratite pažnju na Maskirajte BitLocker ključeve potvrdni okvir, uključen prema zadanim postavkama kako bi se ključne vrijednosti sakrile od znatiželjnih očiju. Druga snimka zaslona prikazuje iste podatke s isključenim potvrdnim okvirom i vidljivim ključnim vrijednostima.
HTML izvješće nudi neke osnovne mogućnosti sortiranja, ali ako na bilo koji način želite manipulirati neobrađenim podacima, umjesto toga najbolje upotrijebite generiranu CSV datoteku i obradite je u programu Excel ili slično.
Sve izlazne datoteke bit će generirane u radnom direktoriju. Ako trebate dodati dodatna svojstva izlazu, možete ih umetnuti između redaka 253-257. Za izvješće o uređaju sva su polja već prikupljena, ali neka od njih skrivamo u izlazu. Ako to želite prilagoditi, uredite popis izuzetih svojstava u liniji 310.
I time možemo zatvoriti ovaj članak. Recite mi što mislite o novoj skripti, smatrate li da je novi pristup usmjeren sigurnosti prikladan? Trebate li njegovu “sirovu” API verziju?

