Simplu scenariu de utilizare GPO

By Andrei Ungureanu - Last updated: Monday, October 12, 2009

Articolul asta ar cam trebui sa fie continuarea celui scris pe ITBoard si sper sa fie pe placul lui Alin 😉

Prima data ar trebui sa pomenesc cate ceva despre modul in care organizam informatiile in AD. Si aici intervin Organizational Unit-urile care sunt containere in care grupam obiectele din AD. Iar modul in care proiectam structura de Organizational Unit-uri poate fi orientat catre delegarea administrarii sau catre aplicarea de Group Policy. Nu exista nici un design batut in cuie, fiecare companie isi poate face structura de Organizational Unit-uri dupa bunul plac, insa e de retinut: nu ghidati acest design dupa departamentele din firma, sedii, functii etc, ci dupa modul in care va administrati infrastructura. Cu cat mai simpla structura cu atat mai bine. Nu vorbim de OU design acum, ci de GPOs.

In exemplu de azi am ales varianta cu OU pentru fiecare locatie (ex: Bucuresti), impartit in doua – Users si Computers. Scopul este de a activa setarea care spune userului daca s-a logat folosind cached credentials in cazul in care DC-ul nu e disponibil.

 

DC R2-2009-10-11-11-34-33

Dar ca exemplu o sa pun un screenshot cu o structura de OU-uri facuta dupa tipul resurselor nu dupa locatie ca sa se poate face diferenta (in continuare o sa mergem tot pe modelul geografic).

 DC R2-2009-10-12-11-20-50

Acum, pentru a lucra cu GPO objects pe containerele nou create e necesar sa deschidem GPMC:

DC R2-2009-10-12-10-16-37

Si sa facem un GPO nou sau link la unul deja existent:

DC R2-2009-10-12-10-17-23

Odata creeat, GPO-ul poate fi gasit in containerul Group Policy Objects si tot de acolo poate fi dezactivat sau numai anumite portiuni User sau Computer settings (in cazul in care o parte din setari nu sunt folosite intr-un GPO – gen GPO care contine numai setari legate de Computer Settings – user configuration settings pot fi dezactivate pentru a grabi procesul de aplicare a politicilor).

 

DC R2-2009-10-12-10-19-28

Sa ne uitam putin si in detaliile acestui GPO. Nu uitati sa le si documentati pentru ca si ceilalti administratori sa stie la ce foloseste si pentru a evita GPO-uri redundante.

 

DC R2-2009-10-12-10-21-21

De remarcat acel Unique ID dupa care putem localiza policy-ul in folderul SYSVOL. User version si Computer version reprezinta numarul modificarii – eu am facut doar una in computer settings (utile atunci cand sunt probleme de replicare a politicilor intre site-uri).

DC R2-2009-10-12-10-24-14

 

DC R2-2009-10-12-10-24-49

In settings vedem exact ce contine politica:

DC R2-2009-10-12-10-21-49

 

Acuma o sa fac o scurta pauza, asta pentru ca am pomenit de SYSVOL. Asta e locul unde sunt stocate politicile si sursa multor probleme pana la Windows 2008. Asta pentru ca mecanismul de replicare al SYSVOL in W2K/W2K3 e FRS care nu merge foarte bine. Fiecare politica nou creata mai adauga cativa MB la acel folder; deoarece fisierele ADM sunt stocate cu fiecare politica in parte pentru a permite editarea politicii de pe orice sistem cu orice OS si localizat in orice limba. Incepand cu Windows 2008 si Vista a fost introdus concepul de ADMX Central Store in care sunt stocate toate fisierele ADMX, acestea fiind disponibile pentru toate GPO-urile si nemaifacand parte din fiecare GPO separat. Chiar si cand DC-ul e 2008, daca editam GPO-ul de la o masina cu XP, acesta o sa adauge fisierele ADM la politica. Asa ca atentie mare la numarul de politici si dimensiunea folderului SYSVOL.

ADMX-urile pentru a incepe cu central Store la gasiti in %windir%\PolicyDefinitions

 

DC R2-2009-10-12-10-29-05

 

Ok, mergem mai departe. Am facut un GPO numit “Setari computere Bucuresti” si ne-am dat seama ca de aceleasi setari avem nevoie sa fie aplicate si peste OU-ul Ilfov. Avem 2 optiuni – mai facem un GPO, sau putem face un link catre acelasi GPO – “Setari computere Bucuresti” (eh, in cazul asta am putea sa-l redenumim si sa scoatem numele Bucuresti).

 

DC R2-2009-10-12-10-32-09

 

DC R2-2009-10-12-10-32-26

 

DC R2-2009-10-12-10-32-35

Si am vazut ca nu e nevoie sa facem GPO-uri pentru fiecare OU nou, ci putem face link-uri catre unele deja existente (si putem avea politici generice pentru toti userii, sau politici care isi au rolul numai intr-un anumit site).

 

Acum ca am vazut cum facem un GPO si cum il legam de un OU, hai sa vedem si ce setari ar trebui sa i se aplice unui user din domeniu. Pentru ca am avut la dispozitie doar un DC pe care eram logat cu userul administrator nu am avut multe optiuni. Putem obtine aceste informatii folosing Grpup Policy Results din consola, specificand userul si sistemul pe care se logheaza:

 

DC R2-2009-10-12-10-34-40

Sau daca vrem sa vedem exact ce s-a aplicat pe acel user (nu ce ar trebui ca in cazul de mai sus) folosind GPRESULT /R (valabil in Vista, 7, 2008; pe celelalte nu e nevoie de /R, mai putin Windows 2000 unde se face cu secedit) de pe statia unde userul e logat:

Microsoft (R) Windows (R) Operating System Group Policy Result tool v2.0
Copyright (C) Microsoft Corp. 1981-2001

Created On 10/12/2009 at 12:36:32 AM

RSOP data for ITBOARD\Administrator on DC1 : Logging Mode
———————————————————-

OS Configuration:            Primary Domain Controller
OS Version:                  6.1.7600
Site Name:                   Default-First-Site-Name
Roaming Profile:             N/A
Local Profile:               C:\Users\Administrator
Connected over a slow link?: No

COMPUTER SETTINGS
——————
    CN=DC1,OU=Domain Controllers,DC=itboard,DC=net
    Last time Group Policy was applied: 10/12/2009 at 12:33:49 AM
    Group Policy was applied from:      DC1.itboard.net
    Group Policy slow link threshold:   500 kbps
    Domain Name:                        ITBOARD
    Domain Type:                        Windows 2000

    Applied Group Policy Objects
    —————————–
        Default Domain Controllers Policy
        Default Domain Policy

    The following GPOs were not applied because they were filtered out
    ——————————————————————-
        Local Group Policy
            Filtering:  Not Applied (Empty)

    The computer is a part of the following security groups
    ——————————————————-
        BUILTIN\Administrators
        Everyone
        BUILTIN\Pre-Windows 2000 Compatible Access
        BUILTIN\Users
        Windows Authorization Access Group
        NT AUTHORITY\NETWORK
        NT AUTHORITY\Authenticated Users
        This Organization
        DC1$
        Domain Controllers
        NT AUTHORITY\ENTERPRISE DOMAIN CONTROLLERS
        Denied RODC Password Replication Group
        System Mandatory Level

USER SETTINGS
————–
    CN=Administrator,CN=Users,DC=itboard,DC=net
    Last time Group Policy was applied: 10/11/2009 at 11:40:43 AM
    Group Policy was applied from:      DC1.itboard.net
    Group Policy slow link threshold:   500 kbps
    Domain Name:                        ITBOARD
    Domain Type:                        Windows 2000
    Applied Group Policy Objects
    —————————–
        N/A

    The following GPOs were not applied because they were filtered out
    ——————————————————————-
        Default Domain Policy
            Filtering:  Not Applied (Empty)

        Local Group Policy
            Filtering:  Not Applied (Empty)

    The user is a part of the following security groups
    —————————————————
        Domain Users
        Everyone
        BUILTIN\Administrators
        BUILTIN\Users
        BUILTIN\Pre-Windows 2000 Compatible Access
        NT AUTHORITY\INTERACTIVE
        CONSOLE LOGON
        NT AUTHORITY\Authenticated Users
        This Organization
        LOCAL
        Domain Admins
        Group Policy Creator Owners
        Schema Admins
        Organization Management
        Enterprise Admins
        Denied RODC Password Replication Group
        High Mandatory Level

 

In cazul de mai sus se poate vedea ca in cazul Computerului au fost aplicate 2 GPO-uri – Default Domain Policy si Default Domain Controllers Policy. In cazul Userului acestea nu au fost aplicate pentru ca nu contineau nici o setare.

GPRESULT e utila si pentru a vedea din ce grupuri face parte utilizatorul dupa logon.

 

Cam atat in acest post insa nu ne oprim aici cu politicile …

Filed in Active Directory • Tags:

Cum trimitem parametri unui VBScript

By Andrei Ungureanu - Last updated: Friday, October 9, 2009

Daca ne-am plictisit sa modificam scripturile de fiecare data pentru a specifica numele serverului sau locul unde e lista, exista si o varianta mai buna. Porninrea scriptului cu parametri.

Pentru asta folosim colectia WScript.Arguments. Si putem verifica daca au fost specificati parametri folosing proprietatea Count:

arguments = WScript.Arguments.Count

Urmand a face si o verificare:

If arguments < 1 then
  WScript.Echo “Ati uitat sa specificati parametrii. Exemplu: cscript script.vbs [parametru]”
  WScript.Quit
end If

Daca se trece mai departe de conditia If putem sa citim parametrii:

param1 = WScript.Arguments.Item(0)

Wscript.Echo param1

Daca avem mai multi citim si celelalte obiecte din colectie ex:WScript.Arguments.Item(1) (ati prins ideea).

 

PS: by default scripturile sunt rulate folosind Wscript.exe atunci cand pornesti scriptul din Explorer. (comportamentul default merge modificat) Recomandat e sa rulati scripturile folosind Cscript.exe (ex: cscript myscript.vbs parametru) pentru a primi output-ul in fereastra din care ati lansat scriptul si pentru a-l putea redirecta.

Filed in Scripting • Tags:

Reading from a text file – VBScript

By Andrei Ungureanu - Last updated: Friday, October 9, 2009

In foarte multe cazuri cand folosim scripturi pentru administrare specificam numele serverului la care sa ne conectam sau ne folosim de o lista in care avem toate serverele. Lista se afla intr-un fisier text si arata cam asa:

Server1
Server2
Server3
Server4

Ideea e ca aveam nevoie de un script care se va conecta la toate sisteme din lista si va face ceva. Ce va face nu e important acum Important e cum citim lista cu serverele. Iata si scriptul:

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("d:\temp\servers.txt", ForReading)
Do While objTextFile.AtEndOfStream <> True
strServer = objTextFile.ReadLine
Wscript.Echo "Server: " & strServer
Loop
objTextFile.Close

 

In linia Set objTextFile = objFSO.OpenTextFile("d:\temp\servers.txt", ForReading) puteti specifica locatia listei. Merge si ca parametru dar in alt post.

Iar in bucla Do While-Loop puteti introduce bucata de cod de care aveti nevoie si care se va folosi de variabila strServer.

Filed in Scripting • Tags:

Recover Exchange Deleted Items from Outlook

By Andrei Ungureanu - Last updated: Friday, October 9, 2009

Pana nu ajungi sa ai nevoie de asa ceva e posibil sa nici nu stii ca exista optiunea asta. In Exchange, chiar daca stergi un mesaj acesta va fi pastrat o perioada de timp si vei avea posibilitatea sa-l recuperezi. Si nu vorbim de Deleted items folder. Putem recupera chiar si mesajele care au fost sterse de acolo; si fara a apela la restore din backup.

Perioada in care Exchange tine email-urile sterse se configureaza la nivel de store (14 zile by default parca era in E2K3) sau chiar si la nivel de mailbox (http://technet.microsoft.com/en-us/magazine/dd560699.aspx).

Cum recuperam un email care nu se mai afla in Deleted Items?

 

image

Accesand Recover Deleted Items din Outlook:

image

Tot de aici pot sa si sterg mesajul definitiv.

Pe versiunile mai vechi de Outlook era o problema atunci cand mesajul era sters cu Shift+Delete si nu mai trecea prin Deleted Items. Ca sa poata fi vazut existau cateva workarounduri:

http://support.microsoft.com/kb/886205

http://support.microsoft.com/kb/178630/

Arhitectura “dumpster-ului” a fost schimbata in Exchange 2010, as ca acolo lucrurile stau putin diferit. Dar mai lasam material si pentru alta data.

Filed in Exchange • Tags:

Get DNS Server info via VBScript

By Andrei Ungureanu - Last updated: Thursday, October 8, 2009

Intr-o retea cu multe servere DNS, si de regula acolo unde sunt multe DC-uri sunt si multe DNS-uri poate o exista o problema in standardizarea setarilor pe aceste servere. Si cum DNS-ul reprezinta una din principalele cauze pentru care din cand in cand lucrurile nu merg asa cum ar trebui m-am gandit sa fac un script care sa se conecteze la toate DC-urile din domeniu si sa afiseze setarile serverului de DNS.

In cazul meu ma interesau setarile ce tin de forwarder, dar hai sa vedem ce a iesit.

Prima data trebuie sa aflam care sunt serverele DC din domeniu. Pentru asta m-am inspirat dintr-un script de-al lui Richard Mueller care se conecteaza la configuration partion si cauta toate obiectele de tip NTDSA. Problema e ca noi trebuie sa cautam doar DC-urile, altfel as fi cautat simplu dupa server, dar e posibil gasesc si ceva servere Exchange care mai apar pe acolo. Cautand dupa NTDSA gasesc DC-urile insa trebuie sa aflu obiectul parinte, de asta am apelat la scriptul lui Richard Mueller ca sa nu ma mai chinui eu. Bineinteles ca exista si alte variante – gen enumerarea obiectelor din containerul Domain Controllers.

 

Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery
Dim adoRecordset, objDC, objSite

‘ Determine configuration context from RootDSE object.
Set objRootDSE = GetObject("LDAP://RootDSE")
strConfig = objRootDSE.Get("configurationNamingContext")

‘ Use ADO to search Active Directory for ObjectClass nTDSDSA.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

strQuery = "<LDAP://" & strConfig _
    & ">;(ObjectClass=nTDSDSA);AdsPath;subtree"

adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 100
adoCommand.Properties("Timeout") = 30
adoCommand.Properties("Cache Results") = False

Set adoRecordset = adoCommand.Execute

‘ The parent object of each object with ObjectClass=nTDSDSA is a Domain
‘ Controller. The parent of each Domain Controller is a "Servers"
‘ container, and the parent of this container is the "Site" container.
Do Until adoRecordset.EOF
    Set objDC = GetObject( _
        GetObject(adoRecordset.Fields("AdsPath").Value).Parent)
    Set objSite = GetObject(GetObject(objDC.Parent).Parent)
    Wscript.Echo "Domain Controller: " & objDC.cn & vbCrLf _
        & "DNS Host Name: " & objDC.DNSHostName & vbCrLf _
        & "Site: " & objSite.name

‘Aici e bucata de cod care se conecteaza la DNS si citeste proprietatile

strComputer =  objDC.cn
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & _
        "\root\MicrosoftDNS")

Set colItems = objWMIService.ExecQuery("Select * from MicrosoftDNS_Server")

For Each objItem in colItems
   

    Wscript.Echo "Address Answer Limit: " & objItem.AddressAnswerLimit
    Wscript.Echo "Allow Update: " & objItem.AllowUpdate
    Wscript.Echo "Autocache Update: " & objItem.AutoCacheUpdate
    Wscript.Echo "Autoconfig File Zones: " & objItem.AutoConfigFileZones
    Wscript.Echo "Bind Secondaries: " & objItem.BindSecondaries
    Wscript.Echo "Boot Method: " & objItem.BootMethod
    Wscript.Echo "Default Aging State: " & objItem.DefaultAgingState
    Wscript.Echo "Default No-Refresh Interval: " & _
        objItem.DefaultNoRefreshInterval
    Wscript.Echo "Default Refresh Interval: " & objItem.DefaultRefreshInterval
    Wscript.Echo "Disable AutoReverse Zones: " & _
        objItem.DisableAutoReverseZones
    Wscript.Echo "Disjoint Nets: " & objItem.DisjointNets
    Wscript.Echo "Directory Service Available: " & objItem.DsAvailable
    Wscript.Echo "Directory Service Polling Interval: " & _
        objItem.DsPollingInterval
    Wscript.Echo "Directory Service Tombstone Interval: " & _
        objItem.DsTombstoneInterval
    Wscript.Echo "EDNS Cache Timeout: " & objItem.EDnsCacheTimeout
    Wscript.Echo "Enable Directory Partitions: " & _
        objItem.EnableDirectoryPartitions
    Wscript.Echo "Enable DNSSec: " & objItem.EnableDnsSec
    Wscript.Echo "Enable EDNS Probes: " & objItem.EnableEDnsProbes
    Wscript.Echo "Event Log Level: " & objItem.EventLogLevel
    Wscript.Echo "Forward Delegations: " & objItem.ForwardDelegations
    If Not IsNull(objItem.Forwarders) Then
        strForwarders = Join(objItem.Forwarders, ",")
        Wscript.Echo "Forwarders: " & strForwarders
    Else
        Wscript.Echo "Forwarders:"
    End If
    Wscript.Echo "Forwarding Timeout: " & objItem.ForwardingTimeout
    Wscript.Echo "Is Slave: " & objItem.IsSlave
    If Not IsNull(objItem.ListenAddresses) Then
        strListenAddresses = Join(objItem.ListenAddresses, ",")
        Wscript.Echo "Listen Addresses: " & strListenAddresses
    Else
        Wscript.Echo "Listen Addresses:"
    End If
    Wscript.Echo "Local Net Priority: " & objItem.LocalNetPriority
    Wscript.Echo "Logfile Maximum Size: " & objItem.LogFileMaxSize
    Wscript.Echo "Logfile Path: " & objItem.LogFilePath
    If Not IsNull(objItem.LogIPFilterList) Then
        strIPFilter = Join(objItem.LogIPFilterList, ",")
        Wscript.Echo "Log IPFilter List: " & strIPFilter
    Else
        Wscript.Echo "Log IPFilter List:"
    End If
    Wscript.Echo "Log Level: " & objItem.LogLevel
    Wscript.Echo "Loose Wildcarding: " & objItem.LooseWildcarding
    Wscript.Echo "Maximum Cache Time-to-Live: " & objItem.MaxCacheTTL
    Wscript.Echo "Maximum Negative Cache Time-to-Live: " & _
        objItem.MaxNegativeCacheTTL
    Wscript.Echo "Name Check Flag: " & objItem.NameCheckFlag
    Wscript.Echo "No Recursion: " & objItem.NoRecursion
    Wscript.Echo "Recursion Retry: " & objItem.RecursionRetry
    Wscript.Echo "Recursion Timeout: " & objItem.RecursionTimeout
    Wscript.Echo "RoundRobin: " & objItem.RoundRobin
    Wscript.Echo "Rpc Protocol: " & objItem.RpcProtocol
    Wscript.Echo "Scavenging Interval: " & objItem.ScavengingInterval
    Wscript.Echo "Secure Responses: " & objItem.SecureResponses
    Wscript.Echo "Send Port: " & objItem.SendPort
    If Not IsNull(objItem.ServerAddresses) Then
        strServerAddress = Join(objItem.ServerAddresses, ",")
        Wscript.Echo "Server Addresses: " & strServerAddress
    Else
        Wscript.Echo "Server Addresses:"
    End If
    Wscript.Echo "Started: " & objItem.Started
    Wscript.Echo "Start Mode: " & objItem.StartMode
    Wscript.Echo "Strict File Parsing: " & objItem.StrictFileParsing
    Wscript.Echo "Update Options: " & objItem.UpdateOptions
    Wscript.Echo "Version: " & objItem.Version
    Wscript.Echo "Write Authority NS: " & objItem.WriteAuthorityNS
    Wscript.Echo "Xfr Connect Timeout: " & objItem.XfrConnectTimeout
    Wscript.Echo "———————————————————-"
Next

    adoRecordset.MoveNext
Loop
adoRecordset.Close

 

Richard merge pe varianta cu Option Explicit de asta exista liniile cu Dim, insa a trebuit sa dezactivez asta pentru ca in bucata mea de cod nu am declarat variabilele. Am lasat si commenturile lui pentru a fi ceva mai inteligibil scriptul.

Daca va intereseaza doar “forwarders” puteti sa da-ti remove la restul liniilor de cod.

Filed in Scripting • Tags:

DNS conditional forwarding in Windows 2008 & R2

By Andrei Ungureanu - Last updated: Wednesday, October 7, 2009

 

Printre improvmenturile ce tin de DNS in ultimele versiuni de Windows se numara si Conditional Forwarding. Bine, bine, asta era si in 2003. W2K8 vine cu ceva nou aici si anume replicarea Conditional Forwarders pe toate serverele din domeniu (sau forest).

image

Intr-un scenariu cu un singur server de DNS asa ceva nu ajuta la nimic. Dar in cazul in care avem un forest AD destul de stufos cu multe DC-uri si implicit cu multe servere DNS iar rezolutia de nume e ceva mai “imbarligata” atunci asa ceva ajuta. Sa luam cazul in care facem un trust cu un alt forest. DC-urile mele trebuie sa rezolve nume din celelalt domeniu, iar consultantii au ales sa folosim DNS forwarders (asta pentru ca nu stiu sa foloseasca Stub Zones). Sa setez sau modific forwarders pe toate DC-urile? Cam peste mana, nu?

In W2K8, regulile de conditional forwarding pot fi stocate in AD si pot seta scopul replicarii (toate serverele DNS din domeniu sau forest).

image

De retinut ca se aplica numai pentru Conditional Forwarding, nu si pentru Forwarding-ul DNS normal (am incercat cu zona . si nu merge 🙂 ). E de inteles pentru ca scopul acestei optiuni e pentru scenariile de rezolutie interna de nume, nu pentru internet. Daca as aplica asa ceva pe toate serverele din domeniu fara posibilitatea ca sa exclud anumite servere de acolo (cele care raspund ce rezoltia de nume in internet) as da totul peste cap. Asa ca e bine ca optiunea e restrictionata doar pentru Conditional Forwarding.

PS: aruncati o privire si pe Stub Zones. Am dat de multi specialisti care se fereau de asa ceva. Poate si pentru ca documentatia era cam greoaie pe vremuri.

Filed in Active Directory, Networking • Tags:

Hidden devices în Device Manager

By Vitalie Ciobanu - Last updated: Wednesday, October 7, 2009

Puțini știu că, implicit, Device Manager nu arată toate componentele instalate pe sistemul de operare. Pentru a vedea și componentele hidden, în meniul View selectăm Show hidden devices. Având această bifă, Device Manager ne va arată și componentele non-Plug and Play.

Ce facem în cazul în care dorim să vedem și componentele care au fost conectate anterior? De exemplu, vreau să văd driverele pentru toate stick-urile pe care le-am folosit. Păi, există o soluție; Microsoft i-a zis workaround deși, tot ei au spus: ”This behavior is by design” 🙂

  1. Deschidem un Command Prompt;
  2. Scriem comanda de mai jos și dăm Enter:
    set devmgr_show_nonpresent_devices=1
  3. Pornim consola de Device Manager din același Command Prompt: 
    start devmgmt.msc 
  4. Din meniul View, selectăm Show hidden devices.

În acest moment avem acces la toate componentele conectate sau nu la calculator în acest moment. Componentele care nu sunt conectate, au iconița transparentă.

Device Manager with hidden devices

Filed in Windows Client, Windows Server • Tags:

Probleme de performanta cu Active Directory?

By Andrei Ungureanu - Last updated: Tuesday, October 6, 2009

De fiecare data cand se intampla e de rau. Majoritatea aplicatiilor care interactioneaza cu AD-ul nu mai functioneaza, mailurile nu mai ajung, utilizatorii nu mai pot accesa resurse din retea. Imediat adminul se uita pe domain controller si vede procesul lsass.exe care tine serverul in 100%. Cum mai mult de atat nu stie sa faca ii da un restart. In unele cazuri poate o sa mearga, sau la scurt timp dupa reboot problema se manifesta din nou.

Problemele ce tin de lsass.exe sunt destul de complicat de diagnosticat in majoritatea cazurilor, insa pana a ajunge la MS Support exista cateva metode prin care putem afla ce se intampla cu serverul. O varianta ar fi chiar deconectarea serverului de la retea pentru a vedea daca problema se mai manifesta. Capturile cu Wireshark pot si ele sa scoata in evidenta destule lucruri.

Astazi o sa ma uit la un tool care a trecut nevazut pe langa foarte multi “specialisti”. Este vorba de SPA, prezent ca download separat pentru Windows 2003 si care este inclus by default in Reliability & Performance tools din W2K8.

Obisnuit cu W2K3 deschid consola folosind PERFMON.

image

Sa zicem ca ne aflam pe DC-ul problematic si vrem sa vedem ce se intampla in interiorul LSASS.EXE. Putem sa facem un Data collector set, si avem la indemana un template care ne face munca usoara:

image

image

O sa fim intrebati unde sa fie salvate datele colectate (si aici e de gandit in unele cazuri) si daca sa pornim captura:

image

image

 

Sau il putem porni direct din System:

image

De test am efectuat cateva cautari in AD folosind ADUC. Pentru a face un test mai interesant ar fi util sa folosim un search LDAP ceva mai complex sau sa incercam sa folosim AD Performance Testing Tool (poate intr-un alt articol). Imediat am oprit data collectorul si acum sa vedem ce am obtinut:

image

Din start vad ca lipsa memoriei RAM imi afecteaza la greu performantele insa nu asta vroiam sa vad acum, ci:

 

image

Si aici incepe distractia. Majoritatea capturilor nu mai au nevoie de explicatii:

image

Putem vedea filtrul folosit in cautare, cat timp au durat, scopul lor sau de ce nu, cautarile care au pus “la grea incercare” serverul:

image

Si nu ne oprim aici:

image

image

image

Cam atat azi despre AD performance troubleshooting. Nu orice problema isi are rezolvare cu SPA, insa foarte multe din categoria performanta pot fi rezolvate folosind acest tool.

Filed in Active Directory

Erorile *009*

By Vitalie Ciobanu - Last updated: Tuesday, October 6, 2009

Configuration Manager (și nu numai) are multe erori de genul 0x8009* sau 0xC009*. Pentru erorile de tipul *009*, o resursă foarte bună este http://blogs.msdn.com/joshpoley/pages/errors-009-facility-sspi.aspx.

Coloana Description ne spune, în linii mari, cauza erorii.

Mai jos e un scurt ”copy/paste”:

Code

HRESULT

Description

#define

768 0x80090300 Not enough memory is available to complete this request SEC_E_INSUFFICIENT_MEMORY
780 0x8009030C The logon attempt failed SEC_E_LOGON_DENIED
808 0x80090328 The received certificate has expired SEC_E_CERT_EXPIRED
4103 0x80091007 The hash value is not correct. CRYPT_E_HASH_VALUE
18446 0x8009480E The Active Directory GUID is unavailable and cannot be added to the Subject Alternate name. CERTSRV_E_SUBJECT_DIRECTORY_GUID_REQUIRED
Filed in Management and monitoring • Tags:

Sa PING-uim cu NMAP

By Andrei Ungureanu - Last updated: Monday, October 5, 2009

 

Un scenariu de care m-am lovit in ultimul timp a fost sa monitorizez via script daca anumite sisteme sunt online. Numele sau IP-urile sistemelor le aveam intr-un fisier TXT. Am facut si scriptul, nici o problema pana aici, doar ca lista continea cateva sute de sisteme iar scriptul facut in VBscript rula pentru minute bune pana cand termina toata lista, asta si pentru ca nu poti sa lucrezi multithread in VBscript 🙁 Un coleg a refacut scriptul in Python si ca sa vezi … aveam outputul in cateva secunde, nu in 15 minute.

Zic, il fac in Powershell, m-am lasat pagubas in scurt timp (nu de tot ca vreau sa-mi fac propriul cmdlet care sa faca asa ceva).

Dupa asta un alt coleg mi-a adus aminte de NMAP, si se pare ca daca nu vrei sa ai de-a face cu scripturi in Python, cam asta e cea mai buna solutie. Iata si un exemplu:

image

Ceva mai rapid ar fi cu –v in loc de –R (fara –v sau –R output-ul arata doar hosturile care sunt UP)

image

NMAP are si parametri prin care poti influenta paralelismul, doar ca eu nu i-am vazut sa functioneze si pentru ping scans. Oricum functioneaza multithreading, insa eu nu am reusit sa-l optimizez dupa bunul meu plac; de fiecare data incepe cu o grupa mica de 5 IP-uri.

De fapt a mers cu –max-parallelism 1 cand a facut aceeasi scanare in 60 de secunde.

Si putem sa trimitem totul catre |findstr down pentru a vedea doar host-urile care nu raspund la ping:

image

PS:In continuare folosesc scriptul facut in Python. Poate o sa-mi termin si cmdlet-ul ca sa am mai multe variante.

Filed in Management and monitoring, Networking