How to access a variable property inside a double-quoted string

By Andrei Ungureanu - Last updated: Tuesday, June 27, 2017

Azi m-am gandit sa explic cazul in care vrei sa folosesti proprietatea unui obiect direct in interiorul unui string.

Sa luam de exemplu cazul in care stocam continutul lui Get-AdUser intr-o variabila

$objUser = Get-ADUser aungureanu

image

Iar acum vrem sa folosim o proprietate a acestui obiect in interiorul unui string. In mod normal ar trebui sa mai folosim inca o variabila intermediara pentru a stoca acea proprietate.

$objSID = $objUser.SID

Iar apoi sa folosim noua variabila direct in string:

image

Dar ca un shortcut, putem accesa direct proprietatea dorita, fara a mai folosi aceasta variabila intermediara. trucul este sa punem totul intr-o expresie folosind paranteze si sa tratam toata expresia ca o variabila cu $, adica $($object.property).

image

Filed in Scripting • Tags:

Powershell SIDHistory Module and Domain Local Groups

By Andrei Ungureanu - Last updated: Tuesday, June 20, 2017

Acum mult timp am scris cate ceva legat de SIDWalker, un tool din Resource Kit-ul de Windows 2003, foarte folositor pe vremuri in diverse scenarii de migrare. Dar tool-ul nu a mai fost updatat de foarte mult timp si inlocuitorul a fost modulul Powershell SIDHistory pe care il gasiti in link-ul de mai jos:

https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Module-for-08769c67

Mi-ar fi greu sa descriu acum tot ce se poate face cu comenzile incluse in acest modul, insa va pot spune ca sunt foarte folositoare atunci cand vreti sa translatati permisiuni pe file system in diverse scenarii de migrare.

Una din comenzile din modul se numeste Export-SIDMappingCustom si permite crearea unui fisier ce va mapa obiecte din domeniul sursa cu obiecte din domeniul target pe baza unui atribut comun (ca exemplu sa zicem samaccountname). Fisierul CSV produs, poate fi folosit mai apot ca sa rulati Convert-SIDHistoryNTFS pe un file sistem si sa faca replace sau add la permisiuni pe baza informatiilor din acel fisier.

Dar daca folositi DomainLocalGroup ca parametru la Export-SIDMappingCustom o sa aveti surpriza sa obtineti doar niste fisiere goale. In caz ca se intampla asa ceva verificati fisierul SIDHistory.psm1 si urmatoarea sectiune:

image

In caz ca grup type pentru DomainLocalGroup este –2147483643, modificati in –2147483644 ca in imaginea de mai sus.

Mai jos o sa pun si link-urile catre seria originala de articole a lui Ashley McGlone, creatorul acestui modul:

  1. Using PowerShell to resolve Token Size issues caused by SID history
    Prior to starting the module development this post explained the background of token size issues as related to SID history.  I provided the basic SID history query that we use to produce the report and some great links for more information on token size.
  2. Do Over: SID History One-Liner
    As a follow up to the Token Size post I re-wrote the SID history report query as a one-liner.
  3. PowerShell: SID Walker, Texas Ranger (Part 1)
    This time we looked at Get-ACL and parsing SDDL strings, a warm up for the next post.
  4. PowerShell: SID Walker, Texas Ranger (Part 2)
    Next I wrote a function to swap SID history entries in ACLs/ACEs.  This compensates for a gap in the ADMT, because it cannot migrate SID history for file shares hosted on a NAS.
  5. PowerShell: SID Walker, Texas Ranger (Part 3): Exporting Domain SIDs and Trusts
    Looking at raw SIDs in a report is not very friendly, so I wrote a function that translates domain SIDs into domain names.  This makes the SID history report more meaningful when you can see the name of the domain from whence they came.  Enumerating all forest trusts and their domain SIDs required using some .NET ninja skills.
  6. How To Remove SID History With PowerShell
    To round out the functions I provided Get-SIDHistory and Remove-SIDHistory, emphasizing that this is the LAST step in the process.  I leveraged the previous domain SID function to even give us the ability to remove SID history selectively by old domain name.

https://blogs.technet.microsoft.com/ashleymcglone/tag/sidhistory/

Filed in Active Directory • Tags: , ,

Topologies for Azure AD Connect

By Andrei Ungureanu - Last updated: Monday, June 19, 2017

Articolul din link-ul de mai jos mi se pare una din cele mai bune documentatii cu scenariile posibile pentru Azure AD Connect:

https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-topologies

Filed in Active Directory, Windows Azure • Tags:

New path for Nano server

By Andrei Ungureanu - Last updated: Thursday, June 15, 2017

Conform Petri se pare ca Microsoft a decis ca Nano server sa fie utilizat exclusiv pentru containere:

https://www.petri.com/microsoft-defines-new-path-nano-server-server-core

Oricum eu am fost multa vreme sceptic si inca sunt si cu Server core, asa ca nu as fi recomandat Nano server pentru roluri de infrastructura nimanui.

Acum sper sa vad si ceva oficial pe tema asta ca in afara de screenshot-ul de pe Petri nu am vazut nimic oficial.

LE: https://blogs.technet.microsoft.com/hybridcloud/2017/06/15/delivering-continuous-innovation-with-windows-server/

Filed in Windows Server • Tags:

Forcing Garbage Collector from Powershell

By Andrei Ungureanu - Last updated: Wednesday, June 14, 2017

In ultimele zile am lucrat cu ceva importuri de fisiere text fiarte mari din Powershell, iar memoria de pe statia de unde lucram era destul de limitata. Si am cam observat ca memoria folosita nu era eliberata imediat dupa ce incheiam taskurile.

Dar am descoperit ca pot sa apelez manual Garbage Collector-ul din .Net folosind[GC]::Collect() sau [System.gc}::Collect()

image

Alte cateva exemple si variante de a elibera memoria nefolosita gasiti in link-ul de mai jos:

http://horizontal-logic.blogspot.ro/2012/08/clearing-up-variables-and-memory-in.html

PS: Metoda poate fi folosita si in interiorul scripurilor ce ruleaza pe intervale mari de timp atunci cand GC-ul nu actioneaza la timp.

Filed in Scripting • Tags: , ,

Process large CSV file from Powershell

By Andrei Ungureanu - Last updated: Monday, June 12, 2017

Lucrul cu fisiere mari de tip CSV in Powershell s-a dovedit a fi un cosmar de multe ori. In special datorita faptului ca folosind Import-CSV aducem tot fisierul in memorie. Si daca avem de lucru cu fisiere de cativa GB atunci putem sa crash-uim foarte usor sistemul de pe care lucram.

Cautand o varianta pe internet sa citesc fisierul linie cu linie am gasit varianta sa folosesc [System.IO.File]::ReadLines descrisa pe aici.

foreach ($line in [System.IO.File]::ReadLines($filename)) {
    # do something with $line
}

Dar nu am mai ajuns pana acolo pentru ca am descoperit ca si folosind Get-Content pot sa citesc fisierul linie cu linie. Exista si parametrul –ReadCount dar nu este nevoie de el, pentru ca by default Get-Content trimite prin pipeline linie cu linie. Toata chestia e sa nu ai dupa pipeline ceva ce stocheaza tot ce vine prin pipeline in memorie din nou.

Insa nu este tot. Nu poti trimite output-ul catre Import-CSV pentru ca acesta nu accepta decat path catre un fisier. Asa ca a fost nevoie sa folosesc ConvertFrom-Csv.

Get-Content .\mytestfile.csv | ConvertFrom-Csv

Iar output-ul dat mai departe de aceasta comanda poate fi prelucrat foarte usor cu Where-Object aka ?

Get-Content .\mytestfile.csv | ConvertFrom-Csv | ? {$_.Name –like ‘something*’}

Iar de aici putem insirui si alte conditii cu Where-Object sau sa folosim Select-Object pentru a selecta doar campurile dorite iar la final sa trimitem totul catre Export-Csv:

Get-Content .\mytestfile.csv | ConvertFrom-Csv | ? {$_.Name –like ‘something*’} |Export-Csv .\final.csv

Filed in Scripting • Tags: ,

How to record everything you do in Powershell

By Andrei Ungureanu - Last updated: Friday, June 9, 2017

Comanda Start-Transcript poate fi folosita pentru a comanda pornirea unui transcript in sesiunea curenta powershell si este o metoda foarte buna de a loga toate actiunile pe care le faceti pe un sistem din powershell.

Pornita fara nici un parametru, comanda Start-Transcript va incepe logarea tuturor comenzilor si a outputlui din sesiunea curenta intr-un fisier text pe care il va salva in My Documents.

image

Dar indicat ar fi sa avem acest transcript activ de fiecare data si fara sa rulam noi de mana Start-Transcript. Iar aici intervin profilele din powershell.

Sunt sase tipuri de profile, toate descrise aici:

https://blogs.technet.microsoft.com/heyscriptingguy/2012/05/21/understanding-the-six-powershell-profiles/

Din ce avem acolo, cea mai simpla solutie ar fi sa folosim $PsHome\Profile.ps1 si de regula locatia corespunde cu C:\Windows\System32\WindowsPowerShell\v1.0\Profile.ps1.

By default nu exista nici un profil creat asa ca va trebui sa creati de mana fisierul Profile.ps1 si sa adaugati comanda Strat-Transcript:

Start-Transcript -path (“$env:temp\PowershellTranscript”+ (get-date -format ddmmyyHHmm)+”.txt”) -force  -noclobber

In exemplul de mai sus am setat locatia in folderul temp din profilul meu, dar atentie ca pentru fiecare sesiune nou deschisa de Powershell, se va crea un fisier nou si avand in vedere ca si output-ul comenzilor este capturat, in cazul in care exista foarte multa activitate vor fi generate destul de multe date. Pe sistemul meu de test, o singura deschidere de Powershell ISE genereaza un fisier de 135Kb (motivul … get-command, get-module la fiecare pornire a Powershell ISE).

Oricum solutia poate fi customizata foarte usor si este ideala pentru servere sau statii de lucru folosite pentru administrare.

Documentatia o gasiti aici:

https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.host/start-transcript

PS: Daca vreti sa aveti si un timestamp al comenzilor, exista paramentrul

-IncludeInvocationHeader

Filed in Scripting • Tags:

Copy the last powershell command to clipboard

By Andrei Ungureanu - Last updated: Wednesday, June 7, 2017

Sunt situatii in care am testat o comanda in Powershell si dorim sa o copiem pentru a fi trimisa unui coleg sau pentru a fi pusa intr-un script. Iar cand este foarte lunga, a face select si copy/paste e un proces destul de lent. Solutia este sa folosim history-ul din Powershell (Get-History aka R) si comanda Clip.

(Get-History)[-1].CommandLine | Clip

In exemplul de mai sus a folosit Get-History cu proprietatea CommandLine si am redirectat totul catre comanda Clip.

Sau pe versiunile mai noi de Powershell (cred ca incepand cu v5) puteti folosi Set-Clipboard:

image

PS: si Start-Transcript este o solutie, doar sa il aveti activat la inceputul sesiunii.

Filed in Scripting • Tags: ,

Memory Deep Dive Series

By Andrei Ungureanu - Last updated: Tuesday, May 23, 2017

O sa postez azi o serie de articole scrise de Frank Denneman de la Vmware, ce mi se par foarte utile atunci cand vrei sa faci un refresh sau update la cunostinte si care sunt foarte utile in scenarii de performance optimization sau troubleshooting:

http://frankdenneman.nl/2015/02/18/memory-configuration-scalability-blog-series/

Part 1: Memory Deep Dive Intro
Part 2: Memory subsystem Organisation
Part 3: Memory Subsystem Bandwidth
Part 4: Optimizing for Performance
Part 5: DDR4 Memory
Part 6: NUMA Architecture and Data Locality
Part 7: Memory Deep Dive Summary

Si tot cam pe acelasi subiect:

Introduction 2016 NUMA Deep Dive Series:

Part 1: From UMA to NUMA
Part 1 covers the history of multi-processor system design and clarifies why modern NUMA systems cannot behave as UMA systems anymore.

Part 2: System Architecture
The system architecture part covers the Intel Xeon microarchitecture and zooms in on the Uncore. Primarily focusing on Uncore frequency management and QPI design decisions.

Part 3: Cache Coherency
The unsung hero of today’s NUMA architecture. Part 3 zooms in to cache coherency protocols and the importance of selection the proper snoop mode.

Part 4: Local Memory Optimization
Memory density impacts the overall performance of the NUMA system, part 4 dives into the intricacy of channel balance and DIMM per Channel configuration.

Part 5: ESXi VMkernel NUMA Constructs
The VMkernel has to distribute the virtual machines to provide the best performance. This part explores the NUMA constructs that are subject to initial placement and load-balancing operations.

Part 6: NUMA Initial Placement and Load Balancing Operations
The VMkernel has to distribute the virtual machines to provide the best performance. This part explores the NUMA initial placement and load-balancing operations.

Part 7: From NUMA to UMA
The world of IT moves in loops of iteration, the last 15 years we moved from UMA to NUMA systems, which today’s focus on latency and the looming licensing pressure, some forward-thinking architects are looking into creating high performing UMA systems.

Filed in Diverse • Tags: ,

Active Directory–Maximum Number of GPOs Applied

By Andrei Ungureanu - Last updated: Tuesday, May 23, 2017

Majoritatea dintre noi nu o sa ajungem niciodata sa ne punem intrebarea din titlu, insa exista cazuri si chiar am vazut unde sunt foarte aproape de limita (si bineinteles cu multe probleme de performanta):

There is a limit of 999 Group Policy objects (GPOs) that you can apply to a user account or computer account. This does not mean that the total number of policy settings on the system is limited to 999. Rather, a single user or computer will not be able to process more than 999 GPOs. This limit exists for performance reasons.

https://technet.microsoft.com/en-us/library/active-directory-maximum-limits-scalability(v=ws.10).aspx#BKMK_GPO

Filed in Active Directory • Tags: