SQL Server PowerShell modul telepítés Azure AD Password authentikációhoz

Azure SQL adatbázishoz szerettem volna csatlakozni az Invoke-Sqlcmd cmdlet segítségével. Ez még nem is lett volna nagy kihívás, ellenben Azure AD authentikációt kellett volna használnom. A szomorú helyzet az, hogy az alap Invoke-Sqlcmd nem tud ilyet, azonban az újabb (13.1 verziótól felfele, innen le lehet tölteni) az sqlcmd.exe igen. Sajnos nekem az nem volt megoldás, így keresnem kellett más lehetőséget. Ez lett az újabb SQLPS modul, amit én is mostanában fedeztem fel. Mentségemre szolgáljon, hogy az utóbbi időben indultak be az Azure SQL adatbázisos munkáim úgy igazán és fontos lett az automatizálás. 

Mégis mi kell ahhoz, hogy Azure AD Password authentikációt tudjak használni PowerShell scriptből? Leginkább a https://www.powershellgallery.com/packages/SqlServer/ oldalon található modul. Ebből a mai napon a legújabb a 21.0.17199-es verzió, a minimum szükséges verzió a 21.0.17099. Ezt kellene feltennem a gépre, hogy menjen. Megjegyzem működik és nagyon szuper :) 

A telepítés már egy kicsit izgalmasabb, mint megtalálni a modult. Első lépésben érdemes megpróbálni az alábbi PoSh script segítségével telepíteni:

Install-Module -Name SqlServer -RequiredVersion 21.0.17199

Ezzel elvileg mennie kell, de nem biztos. Ha nincs fent a nuget provider, akkor azt is szeretné letölteni, így jött is egy ilyen gyönyörű értesítés a PowerShell ISE-ben:

Itt a Yes gombra nyomva letölti ezt is és mehet is tovább a telepítés. Azonban ismét jött egy értesítés, hogy nincs megadva a megbízható reporsitory-k közt az a hely, ahonnan letöltené, így erre is rákérdez:

Itt is a Yes gomb kell a letöltés és a telepítés megkezdéséhez. Igen ám, de nem olyan könnyű ez. Sajnos nekem már volt fent olyan cmdlet, amit ez a modul is tartalmaz. Ilyenkor nincs más lehetőség, csak az AllowClobber kapcsoló, ami esetén "felülírja".

Tehát, a tényleges cmdlet, amit használtam:

Install-Module -Name SqlServer -RequiredVersion 21.0.17199 -AllowClobber

FONTOS: mindenki maga mérlegelje, hogy így vagy egyáltalán nem, vagy saját maga által módosított módon teszi e fel. Az ebből eredő károkért semmilyen felelősséget nem vállalok!!!

Szóval, így már felkerült az új modul, akkor nincs más hátra, mint használjuk is. 

Ahhoz, hogy Azure AD Password authentikációt tudjak használni, egy új paramétert, a ConnectionString-et kell használni, nem lehet a user és a password, mert ugye az a klasszikus SQL authentikációhoz van. Alább egy példa kód, ahogyan nekem ezek után ez működött:

Import-Module -Name SqlServer -RequiredVersion 21.0.17199

$connectionString = "Data Source=mysqlserver.database.windows.net; Authentication=Active Directory Password; Initial Catalog=mydatbase;  UID=myuser@mydomain.tld; PWD=jelszó";
$query = "select * from mytable"

SqlServer\Invoke-Sqlcmd -Query $query -QueryTimeout $([int32]::MaxValue)  -MaxCharLength $([int32]::MaxValue) -MaxBinaryLength $([int32]::MaxValue) -ConnectionString $connectionString

Nézzük meg kicsit közelebbről a kódot: legelőször be kell imortálni az új PoSh modult, amit az Import-Module cmdlet segítségével teszek meg, ráadásul megadtam a verziót is. Igen, nekem fent van több is :). Ezek után a $connectionString változóba került a connection string (szép magyar nevén: kapcsolati karakterlánc :DDD, legalábbis az Azure magyar verzióban így hívják). Ebben szerintem minden önmagáért beszél, ellenben a UID-t kiemelném. Ide fontos, hogy a felhasználó teljes, domain névvel ellátva kell, hogy bekerüljön. Végül meghívjuk az Invoke-Sqlcmd cmdlet-et, azonban itt érdemes figyelni arra, hogy legyen előtte az SqlServer\ mert így tudok hivatkozni az új modulban található cmdlet-re. Ami még érdekes itt, hogy a QueryTimeout, MaxCharLength ls a MaxBinaryLength esetén az int típus maximum értékét adtam meg, ez nekem a lekérdezéseim miatt szükségesek. Erről már korábban írtam itt.

Egy utolsó gondolat. Vajon hova rakja ezt a modult? Erre az alábbi script adja meg a választ, a visszaadott mappák közül bármelyikben, leginkább valószínű, hogy a C:\Program Files\WindowsPowerShell\Modules lesz az.

$Env:PSModulePath
[Environment]::GetEnvironmentVariable("PSModulePath")

 

Add comment