su in der Powershell

Kurt Klinner

Windows also ….

Bedingt durch eine Anforderung aus einem aktuellen Projekt, in dem der Kunde basierend auf DB / AD Informationen Reports erzeugen wollte,
musste ich mich ein wenig mit der Powershell auseinander setzen.

Problem an der Stelle war, dass ich mich mit einem AD Account (der nicht der meinige war) an einem MS SQL Server anmelden musste, um die nötigen Informationen aus der DB abzuziehen.

Die Invoke-Sqlcmd Funktion bietet zwar die Möglichkeiten Username / Password zu übergeben, allerdings scheint dies nur sauber zu laufen,
wenn es sich um DB interne Useraccounts handelt.

Nachdem ich ein wenig Stackoverflow-Engineering / Doku lesen betrieben hab, kam ich zu su-ähnlichen Ansatz.

Die Powershell an sich kann mit einem anderen Useraccount gestartet werden, der lediglich ein credentials Objekt als Parameter für diese Aktion benötigt

$credential = New-Object System.Management.Automation.PsCredential("DOMAIN\USERNAME", (ConvertTo-SecureString 'SECRETPASSWORD' -AsPlainText -Force))
$credential
Start-Process powershell.exe -Credential $credential  -NoNewWindow  "POWERSHELL-SCRIPT"

Die eigentliche Logik bzw. der zu verarbeitende Teil liegt dann in dem "POWERSHELL-SCRIPT", das in der neuen Session gestartet wird
ala

$reportdate=(Get-Date).ToString("yyyyMMdd")
$date = (Get-Date).AddDays(-7).ToString("yyyy/MM/dd")
$users = Invoke-Sqlcmd -Query "select distinct principalname from Repository..userobjects, Repository..usagelog where userobjects.id = userId and start > '$date'" -ServerInstance "SQLSERVERINSTANCE"
$header="Username;Number of Logins;Country"

$header | Out-File "D:\report.csv"
 
ForEach ($user in $users) {
$aduser=$user[0].ToString().Trim()
$adcountry = Get-ADUser -Server "ADSERVER"  -Filter "UserPrincipalName -eq '$aduser'" -properties Country | select-object Country  -ErrorAction silentlycontinue | ft -hidetableheaders  | Out-String
$logins = Invoke-Sqlcmd -Query "select count(userId) from Repository..userobjects, Repository..usagelog where principalname = '$aduser' and userobjects.id = userId and start > '$date' group by Userid" -ServerInstance "SQLSERVERINSTANCE"
$logincount = $logins | %{'{0}' -f $_[0] }
$country = $adcountry.ToString().Trim()
$content = "$aduser;$logincount;$country"
$content |  Out-File -append "D:\report.csv"
}