Sonntag, der 08. September 2024 - 03:10 Uhr

Scripting

BatchScripting

02.02.2022

Batch: Befehlszeile eines Prozesses auslesen

Nehmen wir an, wir wollen per GPO und Startskript diverse Software installieren. Problem dabei ist oft nur, dass man diese nicht parallel installieren kann.

Gehen wir also davon aus, man möchte prüfen, ob ein bestimmtes Skript aktuell läuft, kann dies per wmic ausgelesen und in einen Timeout-Loop übergeben werden.

:CheckInstall

wmic process where "name like '%%cmd%%'" get commandline | find "your_scriptname_or_title_here"

if not ErrorLevel 1 (
goto timeout 
) else ( goto install )

:timeout

TIMEOUT /T 60 >nul

goto CheckInstall

:install

do stuff

Kommentar schreiben
PowershellScripting

31.05.2019

Powershell: Skript als Administrator ausführen – The right way

Wer seine Skripte hin und wieder gerne als Admin ausführen möchte bekommt mehrere Lösungen über die Suchmaschine. Allerdings bieten diese Lösungen nur halbwegs komfortable Lösungen.

Die Probleme über die ich gestolpert bin waren zB: Die normal geöffnete Powershellkonsole blieb offen, der Pfad war System32 usw..

Also begab ich mich auf die Suche nach einer Lösung, mit der ich ein Skript als Admin ausführen kann, ein neuer Prozess gestartet wird, der alte beendet und die Location in die geändert wird, in der sich das aktuell ausgeführte Skript befindet.

function Check-Admin {
	$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
	$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Check-Admin) -eq $false)  
{
	Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
	Stop-Process -Id $PID
}

$scriptDirectory = Split-Path $MyInvocation.MyCommand.Path
Set-Location $scriptDirectory

#Enter Code here.

Kommentar schreiben
PowershellScripting

06.06.2018

Powershell: Wie kombiniere ich zwei Eigenschaften zu einer?

Aus gegebenem Anlass, hatte ich mal wieder so eine Extrawurst, bei der ich die Ausgabe in einem Skript anpassen musste. Im kurzen geht es darum, dass von Befehlen aus einer foreach-Schleife diverse Eigenschaften existieren, oder eben auch nicht um diese dann miteinander zu kombinieren.

Probieren wir es mal visuell darzustellen. Konkret geht es um Informationen aus der Office365 Cloud. Wir möchten uns die Mitglieder eines Postfachs ausgeben. Allerdings ist das kompliziert, da wir hier speziell nach Attributen filtern und zwar nach Benutzern und nach Benutzern die ein Postfach haben.

Beispiel Freigegebenes Postfach:

Administrator (Benutzer): Hat Vollzugriff
Max Mustermann (Benutzer mit Postfach): Hat Vollzugriff

Über get-user können wir im RecipientType sehen, dass wir einmal "User" und einmal "UserMailbox" haben. Die Funktion in dem Teil, war es einen Benutzer von diesem Postfach über den Alias zu entfernen, den es bei einem User nicht gibt.

Also haben wir einmal get-user und einmal get-mailbox was am Ende dann im Prinzip so aussieht:

DisplayName	Alias		Identity
Administrator administrator Max Mustermann mmustermann

Wir wollen jetzt aber unser Alias und Identity in eine Zeile bringen und um das zu schaffen packen wir das ganze sowieso in eine Variable also:

$user | sort DisplayName | FT @{Expression={$_.DisplayName};Label="Name"},@{Expression={"$($_.Alias)$($_.Identity)"};Label="Alias"} -AutoSize
und sieht dann am Ende so aus:

DisplayName	Alias
Administrator administrator Max Mustermann mmustermann

Der komplette Code selber für diejenigen, denen es langweilig ist sieht folgendermaßen aus:
do{
$mailbox = Read-Host 'Geben Sie den Alias der Mailbox ein'

$identity = get-mailbox -identity $mailbox | select -ExpandProperty UserPrincipalName 
}
until ($?)

$Userlist2 = @(Get-MailboxPermission -identity $mailbox | where {$_.AccessRights -eq "FullAccess" -and $_.User -notlike "EURPR*" -and $_.User -notlike "NT*"})

$user1 = Foreach($Mailbox2 in $Userlist2)
{
	$Objectid = get-msoluser -UserPrincipalName $Mailbox2.User
	$Guid = $Objectid.ObjectID | select -expandproperty GUID
	$type = get-user -identity $Guid
	
	if ($type.RecipientType -eq "User")
	{
		get-user -identity $Guid | select DisplayName, Identity
	}
	elseif ($type.RecipientType -eq "UserMailbox")
	{
		get-mailbox -identity $Mailbox2.User | select DisplayName, Alias
	}
	
}
write-host -foregroundcolor Green "`nFolgende Benutzer sind im Postfach ""$mailbox"" als Mitglied hinterlegt:"

$user1 | sort DisplayName | FT @{Expression={$_.DisplayName};Label="Name"},@{Expression={"$($_.Alias)$($_.Identity)"};Label="Alias"} -AutoSize

Wie gesagt, das Skript geht an dieser Stelle noch weiter, hier haben wir nur eine Prüfung quasi, damit wir niemand unberechtigten aus dem Postfach entfernen.

Das wars. Wir setzen in die Format-Table Expression die Variablen quasi nebeneinander und simulieren damit ein Join oder Merge oder wie auch immer. Probiert es aus, das komplette Skript findet ihr im Artikel Office365: Freigegebene Postfächer mit der Powershell verwalten


Eine kleine Quellenangabe zum Lösungsansatz:
Concatenation of Table Output


Kommentar schreiben

Themen:

55 Artikel in 6 Kategorien:

  • Exchange Server (16)
  • Linux (6)
  • Microsoft Server (7)
  • Scripting (3)
  • Tutorials (10)
  • Windows (13)