<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Skript &#8211; Haikos Blog</title>
	<atom:link href="https://www.hertes.net/tag/skript/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hertes.net</link>
	<description>Blog von Haiko Hertes zu allen Themen rund um Microsoft, Cloud und Datacenter</description>
	<lastBuildDate>Wed, 09 Feb 2022 15:44:33 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Azure Migrate &#8211; Gruppen automatisiert befüllen</title>
		<link>https://www.hertes.net/2022/02/azure-migrate-gruppen-automatisiert-befuellen/</link>
					<comments>https://www.hertes.net/2022/02/azure-migrate-gruppen-automatisiert-befuellen/#respond</comments>
		
		<dc:creator><![CDATA[Haiko]]></dc:creator>
		<pubDate>Wed, 09 Feb 2022 18:16:00 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Azure Migrate]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Assessment]]></category>
		<category><![CDATA[Group]]></category>
		<category><![CDATA[Gruppen]]></category>
		<category><![CDATA[Migrate]]></category>
		<category><![CDATA[Skript]]></category>
		<guid isPermaLink="false">https://www.hertes.net/?p=4148</guid>

					<description><![CDATA[Azure Migrate bietet im Alltag viele sehr nützliche Funktionen. Dabei können unter anderem Assessments auf bestehende on-premises Umgebung gefahren werden, um neben einer Kostenindikation auch einen ersten Überblick über die technische Machbarkeit einer Lift-and-Shift-Migration von Servern von on-premises zu erhalten. Insbesondere für diese Assessments (die dann u.a. auch eine Depency Analysis erlauben) werden Gruppen in Azure Migrate benötigt. Diese kann man im Portal nur sehr rudimentär anlegen. Dabei müssen aus der Liste von erkannten on-opremises Servern die gewünschten Systeme in mehreren Listen-Seiten zu je ca. 10 Systemen, die sich weder sortieren noch (sinnvoll) filtern lässt, ausgewählt und mit Checkboxen zur&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Azure Migrate bietet im Alltag viele sehr nützliche Funktionen. Dabei können unter anderem Assessments auf bestehende on-premises Umgebung gefahren werden, um neben einer Kostenindikation auch einen ersten Überblick über die technische Machbarkeit einer Lift-and-Shift-Migration von Servern von on-premises zu erhalten.</p>



<figure class="wp-block-image size-full"><a href="https://www.hertes.net/wp-content/uploads/2022/02/image-1.png"><img fetchpriority="high" decoding="async" width="955" height="288" src="https://www.hertes.net/wp-content/uploads/2022/02/image-1.png" alt="" class="wp-image-4149" srcset="https://www.hertes.net/wp-content/uploads/2022/02/image-1.png 955w, https://www.hertes.net/wp-content/uploads/2022/02/image-1-300x90.png 300w, https://www.hertes.net/wp-content/uploads/2022/02/image-1-768x232.png 768w" sizes="(max-width: 955px) 100vw, 955px" /></a></figure>



<p>Insbesondere für diese Assessments (die dann u.a. auch eine Depency Analysis erlauben) werden Gruppen in Azure Migrate benötigt. Diese kann man im Portal nur sehr rudimentär anlegen. Dabei müssen aus der Liste von erkannten on-opremises Servern die gewünschten Systeme in mehreren Listen-Seiten zu je ca. 10 Systemen, die sich weder sortieren noch (sinnvoll) filtern lässt, ausgewählt und mit Checkboxen zur Gruppe hinzugefügt werden:</p>



<figure class="wp-block-image size-large"><a href="https://www.hertes.net/wp-content/uploads/2022/02/image-2.png"><img decoding="async" width="1024" height="278" src="https://www.hertes.net/wp-content/uploads/2022/02/image-2-1024x278.png" alt="" class="wp-image-4150" srcset="https://www.hertes.net/wp-content/uploads/2022/02/image-2-1024x278.png 1024w, https://www.hertes.net/wp-content/uploads/2022/02/image-2-300x82.png 300w, https://www.hertes.net/wp-content/uploads/2022/02/image-2-768x209.png 768w, https://www.hertes.net/wp-content/uploads/2022/02/image-2-1536x417.png 1536w, https://www.hertes.net/wp-content/uploads/2022/02/image-2-2048x556.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Nun gibt es zwar seit Ende 2020 ein PowerShell-Modul für Azure Migrate &#8211; dieses kann aber bis heute in keinster Weise mit diesen Gruppen umgehen &#8211; weder diese Abfragen, noch anlegen oder verändern.</p>



<p>Aus diesem Grund &#8211; und weil es immer öfter nötig ist, aus hunderten oder tausenden erkannten on-prem Systemen nur einen Teil auszuwählen &#8211; habe ich ein passendes PowerShell-Skript erstellt, welches eine über Hostnamen gegebene Liste von Servern in eine entweder bereits vorhandene oder im Laufe des Skriptes angelegte Gruppe aufnimmt. Dazu werden verschiedene REST-Calls gegen die REST-API von Azure benutzt, um sowohl mit den Gruppen als auch den erkannten Servern umgehen zu können.</p>



<p>Das Skript ist auf meinem GitHub Repo zu finden:</p>



<p><a href="https://github.com/HaikoHertes/scripts/blob/master/Azure/AzureMigrate/GroupAzMigrateServers.ps1">scripts/GroupAzMigrateServers.ps1 at master · HaikoHertes/scripts (github.com)</a></p>



<p>Ich werde in den kommenden Tagen voraussichtlich noch ein paar kleine Verbesserungen vornehmen, das Skript ist aber bereits jetzt voll lauffähig.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hertes.net/2022/02/azure-migrate-gruppen-automatisiert-befuellen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure ARM Templates mit GitHub Actions deployen</title>
		<link>https://www.hertes.net/2020/06/azure-arm-templates-mit-github-actions-deployen/</link>
					<comments>https://www.hertes.net/2020/06/azure-arm-templates-mit-github-actions-deployen/#respond</comments>
		
		<dc:creator><![CDATA[Haiko]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 18:02:33 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Actions]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[CI/CD]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Deploy]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[Pipeline]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Skript]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Templates]]></category>
		<guid isPermaLink="false">https://www.hertes.net/?p=3922</guid>

					<description><![CDATA[Geht es um den Aufbau automatisierter CI/CD Pipelines für Azure, so denken die meisten wohl eher an Azure DevOps. Aber auch mit GitHub lässt sich so etwas erreichen &#8211; und zwar völlig kostenlos. Das Werkzeug dazu heißt GitHub Actions. Zu GitHub Actions selbst will ich hier gar nicht so viel schreiben &#8211; es gibt bereits einige Blogartikel und co. dazu. Ich verweise aber gerne auf mein Video, welches ich dazu gemacht habe: Nun kam von einem meiner geschätzten Kollegen zu Recht die Frage, wie man denn in dieser (ersten, im Video gezeigten) Variante mehrere ARM Templates bereitstellen kann. Und dazu&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Geht es um den Aufbau automatisierter CI/CD Pipelines für Azure, so denken die meisten wohl eher an Azure DevOps. Aber auch mit GitHub lässt sich so etwas erreichen &#8211; und zwar völlig kostenlos. Das Werkzeug dazu heißt GitHub Actions. Zu GitHub Actions selbst will ich hier gar nicht so viel schreiben &#8211; es gibt bereits einige Blogartikel und co. dazu. Ich verweise aber gerne auf mein Video, welches ich dazu gemacht habe:</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Microsoft Azure ?? Mit GitHub Actions ARM Templates ausrollen" width="500" height="281" src="https://www.youtube.com/embed/TRBw1RyRo_I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div><figcaption>Mein YouTube Video zu GitHub Actions</figcaption></figure>



<p>Nun kam von einem meiner geschätzten Kollegen zu Recht die Frage, wie man denn in dieser (ersten, im Video gezeigten) Variante mehrere ARM Templates bereitstellen kann. Und dazu möchte ich hier die passende Antwort liefern&#8230;</p>



<span id="more-3922"></span>



<p>Eine Variante wäre sicherlich, in diesem Skript </p>



<p><a href="https://github.com/HaikoHertes/ActionsDemo/blob/master/.github/workflows/DeployARMtoAzure.yml#L23">https://github.com/HaikoHertes/ActionsDemo/blob/master/.github/workflows/DeployARMtoAzure.yml#L23</a></p>



<p>mehrfach das &#8222;az deployment group create&#8220; aufzurufen &#8211; aber dann müssten man wissen, wie viele Templates es sind und das Skript würde auch schnell sehr lang.</p>



<p>Als aus meiner Sicht bessere Lösung habe ich ein PowerShell Skript geschrieben, dass in der Verzeichnisstruktur des Repositories einen Ordner &#8222;arm\&#8220; erwartet und darin Unterordner mit den Namen der gewünschten Resource Groups. Diese werden falls nötig vom Skript angelegt. Außerdem sucht das Skript Templates im Format XYZ.json und dazugehörige Parameter-Files im Format XYZ.parameters.json. Diese Templates werden nun alphabetisch geordnet mittels ARM bereitgestellt &#8211; egal, wie viele es sind. Dabei werden aus einer Datei &#8222;tags.txt&#8220; falls gewünscht die Tages im Format</p>



<p>Tag = Wert</p>



<p>geladen und bei der Bereitstellung der RGs und Ressourcen mit angewendet. Die zu verwendende Location (nur eine pro RG ist erlaubt, aber das entspricht weitgehend dem üblichen Vorgehen) wird ebenfalls aus einer TXT-Datei location.txt gelesen.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="501" height="308" src="https://www.hertes.net/wp-content/uploads/2020/06/image-1.png" alt="" class="wp-image-3924" srcset="https://www.hertes.net/wp-content/uploads/2020/06/image-1.png 501w, https://www.hertes.net/wp-content/uploads/2020/06/image-1-300x184.png 300w" sizes="auto, (max-width: 501px) 100vw, 501px" /><figcaption>Der erwartete Verzeichnisbaum</figcaption></figure>



<p>Im GitHub Repo müssen zwei Secrets hinterlegt werden:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="473" src="https://www.hertes.net/wp-content/uploads/2020/06/image-1024x473.png" alt="" class="wp-image-3923" srcset="https://www.hertes.net/wp-content/uploads/2020/06/image-1024x473.png 1024w, https://www.hertes.net/wp-content/uploads/2020/06/image-300x139.png 300w, https://www.hertes.net/wp-content/uploads/2020/06/image-768x355.png 768w, https://www.hertes.net/wp-content/uploads/2020/06/image.png 1148w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Screenshot der GitHub Secrets</figcaption></figure>



<p>Einmal ein Secret für die Credentials (wie man die anlegt zeige ich im <a rel="noreferrer noopener" href="https://youtu.be/TRBw1RyRo_I?t=1227" target="_blank">Video ab 20:27</a>) und einmal die Subscription ID der zu verwendenden Subscription. Ergo ist ein Repo pro Subscription nötig&#8230;</p>



<p>Das PowerShell Script selbst könnt ihr hier herunterladen:</p>



<p><a href="https://github.com/HaikoHertes/ActionsDemo.v2/blob/master/DeployARMtoAzure.ps1">https://github.com/HaikoHertes/ActionsDemo.v2/blob/master/DeployARMtoAzure.ps1</a></p>



<p>Alternativ könnt ihr gleich mein ganzes Demo Repo auf GitHub clonen:</p>



<p><a rel="noreferrer noopener" href="https://github.com/HaikoHertes/ActionsDemo.v2" target="_blank">https://github.com/HaikoHertes/ActionsDemo.v2</a> bzw<br><a rel="noreferrer noopener" href="https://github.com/HaikoHertes/ActionsDemo.v2.git" target="_blank">https://github.com/HaikoHertes/ActionsDemo.v2.git</a> <br><br>Wichtig: Damit mit -Tag bzw. -Tags auch die tags gleich mit bereitgestellt werden können braucht man das Az Modul in Version 4.1.0 und das wiederum ist derzeit nur im Ubuntu-20.04 Image auf GitHub enthalten. Siehe dazu auch hier:</p>



<p><a href="https://github.com/marketplace/actions/azure-powershell-action">https://github.com/marketplace/actions/azure-powershell-action</a><br><a href="https://github.com/actions/virtual-environments/blob/master/images/linux/Ubuntu2004-README.md">https://github.com/actions/virtual-environments/blob/master/images/linux/Ubuntu2004-README.md</a><br><a href="https://github.com/actions/virtual-environments/tree/master/images">https://github.com/actions/virtual-environments/tree/master/images</a></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hertes.net/2020/06/azure-arm-templates-mit-github-actions-deployen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Azure &#8211; VMs nach zeit gesteuert hoch- und runterfahren</title>
		<link>https://www.hertes.net/2019/07/azure-vms-nach-zeit-gesteuert-hoch-und-runterfahren/</link>
					<comments>https://www.hertes.net/2019/07/azure-vms-nach-zeit-gesteuert-hoch-und-runterfahren/#respond</comments>
		
		<dc:creator><![CDATA[Haiko]]></dc:creator>
		<pubDate>Sun, 21 Jul 2019 15:48:43 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Automatisierung]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Skript]]></category>
		<guid isPermaLink="false">https://www.hertes.net/?p=3819</guid>

					<description><![CDATA[In meinen Workshops und anderen Kundenterminen kommt immer wieder die Frage, wie man Virtuelle Maschinen in Azure nach Zeit gesteuert hoch- und wieder runterfahren kann. Das ist eigentlich ganz einfach – man benötigt dazu nur folgendes: Einen Azure Automation Account Ein PowerShell Runbook mit entsprechendem Skript VMs mit den entsprechenden Tags Ich habe mich dazu zu folgenden Tags entschieden: AutoShutdown – Entscheidet, ob die VM automatisch heruntergefahren werden soll; kennt die Werte “Yes” and “No” AutoShutdownTime – enthält die entsprechende Zeit für den Shutdown im Format HH:mm:ss nach UTC AutoStartup – Entscheidet, ob die VM automatisch gestartet werden soll; kennt&#8230;]]></description>
										<content:encoded><![CDATA[<p>In meinen Workshops und anderen Kundenterminen kommt immer wieder die Frage, wie man Virtuelle Maschinen in Azure nach Zeit gesteuert hoch- und wieder runterfahren kann. Das ist eigentlich ganz einfach – man benötigt dazu nur folgendes:</p>
<ul>
<li>Einen Azure Automation Account</li>
<li>Ein PowerShell Runbook mit entsprechendem Skript</li>
<li>VMs mit den entsprechenden Tags</li>
</ul>
<p>Ich habe mich dazu zu folgenden Tags entschieden:</p>
<ul>
<li>AutoShutdown – Entscheidet, ob die VM automatisch heruntergefahren werden soll; kennt die Werte “Yes” and “No”</li>
<li>AutoShutdownTime – enthält die entsprechende Zeit für den Shutdown im Format HH:mm:ss nach UTC</li>
<li>AutoStartup – Entscheidet, ob die VM automatisch gestartet werden soll; kennt die Werte “Yes” and “No”</li>
<li>AutoStartupTime – enthält die entsprechende Zeit für den Start im Format HH:mm:ss nach UTC</li>
</ul>
<p><a href="https://www.hertes.net/wp-content/uploads/2019/07/image-1.png"><img loading="lazy" decoding="async" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border: 0px;" title="image" src="https://www.hertes.net/wp-content/uploads/2019/07/image_thumb-1.png" alt="image" width="642" height="216" border="0" /></a></p>
<p>Das PowerShell-Skript findet ihr in meinem GitHub Repo:</p>
<p>https://github.com/HaikoHertes/scripts/blob/master/Azure/Automation/Snoozing/StartAndStopVMsWithAzureAutomation.ps1</p>
<p>Das Skript ist etwas komplexer als die beiden anderen im Repo, berücksichtigt dabei aber auch, dass eine VM ggf. morgens heruntergefahren und abends gestartet werden soll.</p>
<p><a href="https://www.hertes.net/wp-content/uploads/2019/07/image-2.png"><img loading="lazy" decoding="async" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border: 0px;" title="image" src="https://www.hertes.net/wp-content/uploads/2019/07/image_thumb-2.png" alt="image" width="642" height="349" border="0" /></a></p>
<p>Auf Youtube habe ich ein Video veröffentlicht, dass das Vorgehen mit anderen Skripten zeigt:</p>
<p><a href="https://youtu.be/D61XWOeN_w8" target="_blank" rel="noopener noreferrer"><img loading="lazy" decoding="async" style="background-image: none; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; margin-right: auto; border: 0px;" title="YoutubeStartfolieAzure" src="https://www.hertes.net/wp-content/uploads/2019/07/YoutubeStartfolieAzure.jpg" alt="YoutubeStartfolieAzure" width="642" height="362" border="0" /></a></p>
<p>Probiert es einfach mal aus – viel Spaß!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hertes.net/2019/07/azure-vms-nach-zeit-gesteuert-hoch-und-runterfahren/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Office 365 &#8211; Verteiler eines Benutzers mittels PowerShell herausfinden</title>
		<link>https://www.hertes.net/2018/06/office-365-verteiler-eines-benutzers-mittels-powershell-herausfinden/</link>
					<comments>https://www.hertes.net/2018/06/office-365-verteiler-eines-benutzers-mittels-powershell-herausfinden/#respond</comments>
		
		<dc:creator><![CDATA[Haiko]]></dc:creator>
		<pubDate>Sat, 16 Jun 2018 22:35:24 +0000</pubDate>
				<category><![CDATA[Office 365]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Distribution Group]]></category>
		<category><![CDATA[Distribution List]]></category>
		<category><![CDATA[Group]]></category>
		<category><![CDATA[Office365]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Skript]]></category>
		<category><![CDATA[Verteiler]]></category>
		<guid isPermaLink="false">https://www.hertes.net/?p=3678</guid>

					<description><![CDATA[Immer mal wieder stell sich uns die Frage, in welchen Verteilern ein bestimmter Benutzer Mitglied ist. Natürlich kann man sich im Office365 Admin-Portal das Postfach ansehen, dort wird einem aufgelistet, wo der User Mitglied ist – allerdings werden hier nur die direkten Mitgliedschaften aufgelistet. In der Regel sind Verteiler / Distribution Lists aber in einander verschachtelt, um z.B. Team- / Gruppen- /Abteilungsstrukturen abzubilden. Um nun nicht von Hand alle Verteiler auf deren Mitgliedschaft in weiter oben liegenden Verteilern prüfen zu müssen, habe ich ein PowerShell-Skript geschrieben. Dieses ermittelt zunächst, in welchen Verteilern der Benutzer unmittelbar enthalten ist und prüft dann&#8230;]]></description>
										<content:encoded><![CDATA[<p>Immer mal wieder stell sich uns die Frage, in welchen Verteilern ein bestimmter Benutzer Mitglied ist. Natürlich kann man sich im Office365 Admin-Portal das Postfach ansehen, dort wird einem aufgelistet, wo der User Mitglied ist – allerdings werden hier nur die direkten Mitgliedschaften aufgelistet. In der Regel sind Verteiler / Distribution Lists aber in einander verschachtelt, um z.B. Team- / Gruppen- /Abteilungsstrukturen abzubilden. Um nun nicht von Hand alle Verteiler auf deren Mitgliedschaft in weiter oben liegenden Verteilern prüfen zu müssen, habe ich ein PowerShell-Skript geschrieben.</p>
<p>Dieses ermittelt zunächst, in welchen Verteilern der Benutzer unmittelbar enthalten ist und prüft dann diese Verteiler auf “Eltern”, also weiter oben stehende Verteiler, die den betreffenden Verteiler (und damit dann eben indirekt den Bnutzer) enthalten.</p>
<p>Hier ist das Skript:</p>
<pre lang="PowerShell">[string[]]$global:AllreadyChecked = $null

function Get-DistributionGroupAllParents
{
    param ([string]$GroupName)
    
    [string[]]$Parents = $null
    
    ForEach ($Group in Get-DistributionGroup) 
    {
       If((Get-DistributionGroupMember $Group.Name | Where RecipientType -NE "UserMailbox").Name -contains $Groupname)
       {
          # Make sure, we are only checking every DGs parents once as many DG tree leafs may lead to the same parent DG
          If($global:AllreadyChecked -notcontains ($Group.Name))
          {
                $Parents += $Group.Name
                Get-DistributionGroupAllParents -GroupName $Group.Name
                $global:AllreadyChecked += $Group.Name
          }
       } 
    }
    Return $Parents
}

# Connect to Office 365
If((Get-PSSession | Where Computername –like "*ps.outlook.com*" | Where State –eq "Opened" | Measure-Object).Count -lt 1)
{
    $Credentials = Get-Credential –UserName "USER@DOMAIN.COM" -Message "Please enter your Office 365 / Azure AD password!"
    $ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $Credentials -Authentication Basic -AllowRedirection -WarningAction SilentlyContinue
    Import-PSSession $ExchangeSession -AllowClobber -DisableNameChecking &gt;&gt; $null
}
elseif((Get-PSSession | Where Computername -like "*ps.outlook.com*" | Where Availability -eq "Available" | Where State -ne "Opened" | Measure-Object).Count -ge 1)
{
    Import-PSSession -Session (Get-PSSession | Where Computername -like "*ps.outlook.com*" | Where Availability -eq "Available" | Select -Last 1)
}

# Get all DGs a user is member of
$User = Read-Host -Prompt "Enter User to check!" 
$Recipient = (Get-Recipient -RecipientType UserMailbox -Identity $User).Name
Write-Host "Script started discovery - this could take a while" -ForegroundColor Red

[string[]]$AllParents = $null
ForEach ($Group in Get-DistributionGroup) 
{
   If((Get-DistributionGroupMember $Group.Name).Name -contains $Recipient)  # Find all Groups the User is immediate member of:
   {
      $AllParents += $Group.Name
      Write-Host -ForegroundColor Green "$($Group.Name) ($($Group.PrimarySmtpAddress))"
      $AllParents += (Get-DistributionGroupAllParents -Group $Group.Name)
   } 
}

Write-Host "User is member of these groups (for some of them, he may be member through nested groups!):"
$AllParents.Where({ $_ -ne "" }) | select -uniq | sort | Get-DistributionGroup | ft DisplayName,Name,PrimarySmtpAddress -AutoSize</pre>
<p>&nbsp;</p>
<p>Viel Spaß damit!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hertes.net/2018/06/office-365-verteiler-eines-benutzers-mittels-powershell-herausfinden/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PowerShell &#038; Fotobox &#8211; Fotos zu einem bestimmten Hashtag von Instagaram laden</title>
		<link>https://www.hertes.net/2018/01/powershell-fotobox-fotos-zu-einem-bestimmten-hashtag-von-instagaram-laden/</link>
					<comments>https://www.hertes.net/2018/01/powershell-fotobox-fotos-zu-einem-bestimmten-hashtag-von-instagaram-laden/#comments</comments>
		
		<dc:creator><![CDATA[Haiko]]></dc:creator>
		<pubDate>Tue, 30 Jan 2018 05:42:00 +0000</pubDate>
				<category><![CDATA[Fotobox]]></category>
		<category><![CDATA[Fotografie]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Instagram]]></category>
		<category><![CDATA[Photobooth]]></category>
		<category><![CDATA[Skript]]></category>
		<guid isPermaLink="false">https://www.hertes.net/?p=3527</guid>

					<description><![CDATA[Auf meiner in den letzten Wochen und Monaten gebauten Fotobox (Mehr dazu hier) gibt es einen extra Bildschirm für eine Slideshow der aufgenommenen Fotos. Diese zeigt die neuesten x Fotos aus der Liste aller aufgenommenen Bilder, wobei ein neues Foto immer das älteste Bild ablöst (zu der technischen Realisierung hier werde ich später noch einen größeren Artikel schreiben). Nun kam mir in diesem Zusammenhang die Idee, aus den sozialen Medien ebenfalls die aktuellsten Bilder zu einem bestimmten Hashtag abzurufen, damit die Gäste unter diesem Hashtag Handyfotos posten könnten, die dann wiederum in die Slideshow einfließen sollten. Hierzu gibt es ein&#8230;]]></description>
										<content:encoded><![CDATA[<p>Auf meiner in den letzten Wochen und Monaten gebauten Fotobox (<a href="https://www.hertes.net/tag/fotobox/">Mehr dazu hier</a>) gibt es einen extra Bildschirm für eine Slideshow der aufgenommenen Fotos. Diese zeigt die neuesten x Fotos aus der Liste aller aufgenommenen Bilder, wobei ein neues Foto immer das älteste Bild ablöst (zu der technischen Realisierung hier werde ich später noch einen größeren Artikel schreiben).</p>
<p>Nun kam mir in diesem Zusammenhang die Idee, aus den sozialen Medien ebenfalls die aktuellsten Bilder zu einem bestimmten Hashtag abzurufen, damit die Gäste unter diesem Hashtag Handyfotos posten könnten, die dann wiederum in die Slideshow einfließen sollten. Hierzu gibt es ein paar Lösungen im Internet, die aber fast alle recht teuer sind und auch größtenteils nur im Browser ablaufen. Ich wollte aber gern die einzelnen Dateien lokal auf dem Rechner haben. Also habe ich mir ein PowerShell-Skript geschrieben, welches genau diese Anforderung erfüllt – allerdings vorerst nur für Instagram.</p>
<pre lang="PowerShell" line="1"># What are you searching for?
$Hashtag = "PUTYOURHASHTAGHERE"

# How long to wait for the next retry - set to 0 to only search once
$SecondsBetweenRequests = 10

# Where do you want to store the downloaded pictures? Use no "\" at the end!
$WhereToStorePictures = "D:\Pictures\" 

### Don't change anything below here unless you know what you are doing! ###

# If the destination folder does not exist, we need to create it first
If(!(Test-Path $WhereToStorePictures -PathType Container)) 
{
    New-Item $WhereToStorePictures -ItemType Directory
}

$URI = "https://www.instagram.com/explore/tags/$Hashtag/"

# We are running this from now one until CTRL-C is pressed
Write-Host "To stop the process, press CTRL+C - otherwise it runs forever!" -ForegroundColor Yellow
While($true)
{
    # Get the whole content according to the hashtag search
    $HTML = Invoke-WebRequest -Uri $URI 

    # Get all the filenames of pictures with that hashtag from the HTML
    $URLs = ($HTML.Content | Select-String -Pattern '"display_url":\s.*?"edge_liked_by"' -AllMatches).Matches.Value | ForEach-Object {$_.Substring(16,$_.Length-34)}

    # Iterate through all the pics on the website
    ForEach($URL in $URLs)
    {
        # We need the filename to see if it was allready downloaded
        $Filename = $URL.Substring($URL.LastIndexOf('/')+1,$URL.length-$URL.LastIndexOf('/')-1) 
        
        # If the pic is not allready in the destination folder, download it
        If(!(Test-Path -PathType Leaf -Path "$WhereToStorePictures\$Filename"))
        {
            Write-Host "`nNew Picture found!" # You can remove this if you want
            Start-BitsTransfer $URL -Destination "$WhereToStorePictures\" # The actual download
        }
    }
    If($SecondsBetweenRequests -eq 0) # Then we just do the download-thing once
    {
        break
    }
    else
    {
        Start-Sleep -Seconds $SecondsBetweenRequests
        Write-Host "." -NoNewline # Just to let you know it is still working... - you can remove this if you want
    }

}</pre>
<p>&nbsp;</p>
<p>Das Skript ist wie üblich auch im Microsoft Script Center zu finden: <a href="https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Instagram-7d9ddb44">https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Instagram-7d9ddb44</a></p>
<p>Viel Spaß beim Ausprobieren oder adaptieren!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hertes.net/2018/01/powershell-fotobox-fotos-zu-einem-bestimmten-hashtag-von-instagaram-laden/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Hyper-V-Server / Windows Server Core: Treiber via PowerShell installieren</title>
		<link>https://www.hertes.net/2016/06/hyper-v-server-windows-server-core-treiber-via-powershell-installieren/</link>
					<comments>https://www.hertes.net/2016/06/hyper-v-server-windows-server-core-treiber-via-powershell-installieren/#respond</comments>
		
		<dc:creator><![CDATA[Haiko]]></dc:creator>
		<pubDate>Thu, 23 Jun 2016 18:53:25 +0000</pubDate>
				<category><![CDATA[Hyper-V]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[Windows Server 2012 R2]]></category>
		<category><![CDATA[Driver]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Skript]]></category>
		<category><![CDATA[Treiber]]></category>
		<guid isPermaLink="false">http://www.hertes.net/?p=3190</guid>

					<description><![CDATA[Wer einen Windows Server 2012 R2 als Core-Server oder den kostenfreien Hyper-V-Server 2012 R2 einsetzt, dem könnte folgendes Problem begegnen: Auf dem Server selber gibt es bekanntlich keine GUI und demnach auch keinen Gerätemanager. Und seit 2012 R2 lässt sich dieser auch nicht remote von einem grafischen Server aus ansprechen! Was nun also tun, wenn man Treiber installieren/aktualisieren/entfernen will? Dazu möchte ich hier einige Kommandos als Hilfestellung zusammentragen: &#160; Installation aller Treiber des aktuellen Verzeichnisses in das Treiber-Repository: Get-ChildItem -Recurse -Filter *.inf &#124; Select-Object FullName &#124; ForEach-Object {pnputil -a $_.FullName} Installation eines bestimmten Treibers: pnputil.exe -i -a C:\Pfad\zum\Treiber.inf (ACHTUNG: Installiert&#8230;]]></description>
										<content:encoded><![CDATA[<p>Wer einen Windows Server 2012 R2 als Core-Server oder den kostenfreien Hyper-V-Server 2012 R2 einsetzt, dem könnte folgendes Problem begegnen: Auf dem Server selber gibt es bekanntlich keine GUI und demnach auch keinen Gerätemanager. Und seit 2012 R2 lässt sich dieser auch nicht remote von einem grafischen Server aus ansprechen!</p>
<p>Was nun also tun, wenn man Treiber installieren/aktualisieren/entfernen will? Dazu möchte ich hier einige Kommandos als Hilfestellung zusammentragen:</p>
<p>&nbsp;</p>
<p><strong>Installation aller Treiber des aktuellen Verzeichnisses in das Treiber-Repository:</strong></p>
<p>Get-ChildItem -Recurse -Filter *.inf | Select-Object FullName | ForEach-Object {pnputil -a $_.FullName}</p>
<p><strong>Installation eines bestimmten Treibers:</strong></p>
<p>pnputil.exe -i -a C:\Pfad\zum\Treiber.inf</p>
<p>(ACHTUNG: Installiert diesen Treiber für alle &#8222;passenden&#8220; Geräte!)</p>
<p><strong>Auflisten aller Treiber im Repository (3rd Party):</strong></p>
<p>pnputil.exe -e</p>
<p><strong>Entfernen eines Treibers aus dem Repository:</strong></p>
<p>pnputil.exe -d oemX.inf (Name der INF-Datei über pnputil -e)</p>
<p><strong>Entfernen aller Treiber aus dem Repository:</strong></p>
<p>1..40 | ForEach-Object {pnputil.exe -d &#8222;oem$_.inf&#8220;} (Die Zahl 40 muss ausgetauscht werden durch die höchste Zahl aus pnputil -e)</p>
<p><strong>Ermitteln der Hardware-ID der Geräte einer bestimmten Geräteklasse (hier: Netzwerkkarten)</strong></p>
<p>devcon.exe listclass net</p>
<p><strong>Anzeigen des von einem Gerät benutzten Treibers:</strong></p>
<p>devcon.exe driverfiles &#8222;@PCI\VEN_8086&amp;DEV_10D3&amp;SUBSYS_040D15D9&amp;REV_00\4&amp;60B4255&amp;0&amp;00E4&#8220;</p>
<p><strong>Installation eines bestimmten Treibers für ein bestimmtes Gerät:</strong></p>
<p>devcon.exe /r install C:\Pfad\zum\Treiber.inf &#8222;@PCI\VEN_8086&amp;DEV_10D3&amp;SUBSYS_040D15D9&amp;REV_00\4&amp;60B4255&amp;0&amp;00E4&#8220;</p>
<p><strong>Entfernen eines konkreten Gerätes (nicht nur der Treiber!):</strong></p>
<p>devcon.exe /r remove &#8222;@PCI\VEN_8086&amp;DEV_10D3&amp;SUBSYS_040D15D9&amp;REV_00\4&amp;60B4255&amp;0&amp;00E4&#8220;</p>
<p><strong>Nach neuen Geräten suchen:</strong></p>
<p>devcon.exe rescan</p>
<p>&nbsp;</p>
<p><em>Für einige Varianten ist DevCon.exe nötig. Siehe dazu hier:</em></p>
<p>https://msdn.microsoft.com/de-de/library/windows/hardware/ff544707(v=vs.85).aspx</p>
<p>http://www.wintotal.de/tipparchiv/?id=2075</p>
<p>Der Artikel wird künftig weiter ergänzt&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hertes.net/2016/06/hyper-v-server-windows-server-core-treiber-via-powershell-installieren/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
