Cum aflam cine este logat pe o statie? (via Active Directory)
Sunt convins ca fiecare admin are metoda lui de a verifica cine este logat pe o statie.
Ca sa dam cateva exemple :
– Sesiune de RDP catre statia respectiva (dupa validare suntem intrebati daca vrem (sau nu) sa deconectam userul).
– Query WMI pe statie.
– Diverse tool-uri third party
-Scripturi In-house
M-am tot gandit in ultima vreme la o metoda mai eleganta de a centraliza aceste informatii. Am tot analizat acest proces si de la un sheet in excel am ajuns la concluzia ca ar fi mai util sa fie in AD, mai ales ca fiecare dintre noi il foloseste mai tot timpul. Asa ca m-am gandit ca ar fi bine sa fac un script.
Acest script va verifica din sesiunea locala variabilele de sistem %username% si %computername% iar daca ele sunt identice cu cele din AD (aici ma refer la common name-ul asociat obiectelor) atunci va modifica attributul description pentru obiectul aferent statiei cu un string formatat din script.
Acesta se va aplica la user logon printr-un GPO, sau setat ca logon script din Active Directory User and Computers in tabul profile.
Inainte de a incepe cu analiza scriptului voi sublinia pasi logici de implementare:
1. Script
2. Modificarea securitatii pe OU-ul care contine statiile.
3. Creare GPO, sau setat ca logon script din Active Directory User and Computers in tabul profile.
4. Testare
5. Aplicare politica
In acest articol voi prezenta doar pasii 1 si 2.
1. Script
Codul scriptului este colorat in gri pentru o preluare mai rapida in pagina.
‘Created by Mihai Marius 2009
‘
Set wshShell = WScript.CreateObject( “WScript.Shell” )
Local_ComputerName = wshShell.ExpandEnvironmentStrings( “%COMPUTERNAME%” )
Local_UserName = wshShell.ExpandEnvironmentStrings( “%USERNAME%” )
Set objSysInfo = CreateObject( “ADSystemInfo” )
AD_ComputerName = objSysInfo.ComputerName
AD_UserName = objSysInfo.UserName
Set objUser = GetObject(“LDAP://” & AD_UserName)
Set objComputer = GetObject(“LDAP://” & AD_ComputerName)
If Local_UserName = objUser.CN and Local_ComputerName = objComputer.CN Then
Text_Desc = “Userul ” & objUser.CN & ” s-a connectat la ” & Now & “.”
objComputer.Description = Text_Desc
objComputer.SetInfo
Set wshShell = Nothing
Set objSysInfo = Nothing
Set objComputer = Nothing
Set objUser = Nothing
Else
Set wshShell = Nothing
Set objSysInfo = Nothing
Set objComputer = Nothing
Set objUser = Nothing
End If
WScript.Quit
Acum sa analizam codul si sa oferim cateva informatii.
Set wshShell = WScript.CreateObject( “WScript.Shell” )
Local_ComputerName = wshShell.ExpandEnvironmentStrings( “%COMPUTERNAME%” )
Local_UserName = wshShell.ExpandEnvironmentStrings( “%USERNAME%” )
Initializam un shell pentru sesiunea locala de unde extragem variabilele de sistem %computername% si %username%.
Valorile returnate vor fi declarate ca Local_ComputerName si Local_UserName.
Set objSysInfo = CreateObject( “ADSystemInfo” )
AD_ComputerName = objSysInfo.ComputerName
AD_UserName = objSysInfo.UserName
Cream o instanta a clasei ADSystemInfo, pentru a utiliza obiectele din AD care fac referinta la statie si utilizator. Este important de subliniat valoarea acestei clase deoarece ea ne returneaza DN-ul (distinguished name) obiectelor util in pasul urmator.
Set objUser = GetObject(“LDAP://” & AD_UserName)
Set objComputer = GetObject(“LDAP://” & AD_ComputerName)
Query LDAP pentru a utiliza atributele din AD asociate statiei si utilizatorului.
If Local_UserName = objUser.CN and Local_ComputerName = objComputer.CN Then
Text_Desc = “Userul ” & objUser.CN & ” s-a connectat la ” & Now & “.”
O functie de validare intre valorile locale si valorile asociate obiectelor in AD. M-am gandit sa fac un double check ale acestor valori pentru a nu modifica campul description daca nu ele nu sunt identice.
Daca valorile sunt egale atunci se formateaza textul pentru descriere. Intial m-am gandit sa trec doar utilizatorul dar am vazut pe net si alte abordari de forma: “Userul x s-a logat la data z ora y” si m-am gandit ca acesta abordare ar fi mai utila pentru debugging.
objComputer.Description = Text_Desc
objComputer.SetInfoSet wshShell = Nothing
Set objSysInfo = Nothing
Set objComputer = Nothing
Set objUser = Nothing
Setam textul formatat pentru atributul description al obiectului ce reprezinta statia. Eliminam obiectele care au fost incarcate in memoria sistemului .
Else
Set wshShell = Nothing
Set objSysInfo = Nothing
Set objComputer = Nothing
Set objUser = Nothing
End If
WScript.Quit
Daca valorile nu sunt egale atunci eliminam obiectele care au fost incarcate in memoria sistemului dupa care terminam functia si iesim din script.
2.Modificarea securitatii pe OU-ul care contine statiile.
In acest pas voi descrie modul in care putem modifica securitatea OU-ului in care se regasesc obiectele care fac referinta la statiile din domeniu, pentru a permite doar modificarea campului description.
Fara aceste permisiuni de modificare acest script nu va functiona pentru useri simpli (ma refer desigur la Domain Users).
In exemplul meu voi folosi OU-ul Comp iar permisiunile le voi asocia groupului Domain Users. Ar fi de preferat sa utilizam un alt group ca sa nu-l folositi pe cel default, pentru a limita expunerile la eventuale atacuri.
Deschidem consola de Active Directory Users and Computers –> Selectam OU-ul Comp –> click dreapta Security si selectam Advanced –> Add –> Introducem Domain Users si selectam OK –> selectam tabul Properties.
In campul Apply onto selectam “Computer objects” si selectam Write Description.
Poza arata exact pasi enumerati mai sus.
Click OK, three times.
Dupa aplicarea scriptului in campul description al unei statii ar trebui sa arate asa:
Sfat: Inainte de aplicarea acestei politci ar fi bine sa faceti cateva teste pentru a nu perturba activitatea.
Troubleshooting: In cazul in care nu ati configurat corect , partea de permisiuni pe OU, veti primi un mesaj de eroare (pe sesiunea clientului) de forma :