Simplu scenariu de utilizare GPO
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.
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).
Acum, pentru a lucra cu GPO objects pe containerele nou create e necesar sa deschidem GPMC:
Si sa facem un GPO nou sau link la unul deja existent:
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).
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.
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).
In settings vedem exact ce contine politica:
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
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).
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:
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 …
Cum trimitem parametri unui VBScript
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.
Reading from a text file – VBScript
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.
Recover Exchange Deleted Items from Outlook
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?
Accesand Recover Deleted Items din Outlook:
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.
Get DNS Server info via VBScript
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.
DNS conditional forwarding in Windows 2008 & R2
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).
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).
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.
Hidden devices în Device Manager
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” 🙂
- Deschidem un Command Prompt;
- Scriem comanda de mai jos și dăm Enter:
set devmgr_show_nonpresent_devices=1 - Pornim consola de Device Manager din același Command Prompt:
start devmgmt.msc - 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ă.
Probleme de performanta cu Active Directory?
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.
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:
O sa fim intrebati unde sa fie salvate datele colectate (si aici e de gandit in unele cazuri) si daca sa pornim captura:
Sau il putem porni direct din System:
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:
Din start vad ca lipsa memoriei RAM imi afecteaza la greu performantele insa nu asta vroiam sa vad acum, ci:
Si aici incepe distractia. Majoritatea capturilor nu mai au nevoie de explicatii:
Putem vedea filtrul folosit in cautare, cat timp au durat, scopul lor sau de ce nu, cautarile care au pus “la grea incercare” serverul:
Si nu ne oprim aici:
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.
Erorile *009*
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 |
Sa PING-uim cu NMAP
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:
Ceva mai rapid ar fi cu –v in loc de –R (fara –v sau –R output-ul arata doar hosturile care sunt UP)
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:
PS:In continuare folosesc scriptul facut in Python. Poate o sa-mi termin si cmdlet-ul ca sa am mai multe variante.