Haikos Blog Blog von Haiko Hertes zu allen Themen rund um Microsoft und Datacenter

30Jan/180

PowerShell & Fotobox – Fotos zu einem bestimmten Hashtag von Instagaram laden

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 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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
    }
 
}

 

Das Skript ist wie üblich auch im Microsoft Script Center zu finden: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Instagram-7d9ddb44

Viel Spaß beim Ausprobieren oder adaptieren!

26Jan/180

Hyper-V & PowerShell – Kerberos Delegierung für LiveMigration für mehrere Server gegenseitig eintragen

Hinweis: Wer mehr zu diesem Thema wissen möchte, kann gerne meinen ausführlichen Artikel zu diesem Thema lesen!

Nichts neues, aber da es mir heute wieder über den Weg gelaufen ist: Wenn man mittels Hyper-V Manager eine VM von einem Host auf einen anderen live verschieben, dann gibt es im Wesentlichen zwei mögliche Protokolle: CredSSP und Kerberos.

kerberos1

CredSSP ist in der Anendung grundsätzlich einfach, hat aber einen entscheidenden Nachteil: Man muss interaktiv (!) an dem Host angemeldet sein, von dem man die VM (weg) verschieben will. Andernfalls bekommt man einen hübschen Fehler:

kerberos2kerberos3

Der Fehlertext lautet:

Fehler beim Herstellen einer Verbindung mit dem Host “DERHOSTNAME”: Die Anmeldeinformationen, die dem Paket übergeben wurden, wurden nicht erkannt. (0x8009030D).

Failed to establish a connection with host “THEHOSTNAME”: No credentials are available in the security package (0x8009030E)

Insbesondere auf Core-Servern bleibt hier also nur eine Möglichkeit: Man muss auf Kerberos umstellen! Dazu jedoch müssen sich die Server, zwischen denen man verschieben möchte, für das Protokoll “cifs” und “Microsoft Virtual System Migration Service” vertrauen.

Das könnte man jetzt im ActiveDirectory manuell konfigurieren – aber spätestens bei einer zweistelligen Anzahl an Hosts ist das eine sehr mühsame Klickerei. Also warum nicht PowerShell bemühen? Ich habe mir dazu schon vor einer ganzen Weile ein recht kurzes Skript geschrieben, was jeden der aufgeführten Host gegen jeden anderen berechtigt bzw. die Kerberos-Delegierung einrichtet.

Hier das Skript im Textlaut. Viel Spaß damit!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$Domain = 'api-leipzig.local'
 
# Actually not needed anymore, but who knows...
Import-Module ActiveDirectory
# Put the NetBIOS names of your hosts here
$HyperVHosts = "HOST1","HOST2","HOST3","HOST4","HOST5"
 
ForEach($Host1 in $HyperVHosts)
{
    ForEach($Host2 in $HyperVHosts)
    {
        If($Host1 -ne $Host2)
        {
            "Delegating from $Host1 to $Host2..."
            Get-ADComputer $Host1 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo" = "Microsoft Virtual System Migration Service/$($Host2).$($Domain)", "cifs/$($Host2).$($Domain)", "Microsoft Virtual System Migration Service/$Host2", "cifs/$Host2"}
            Get-ADComputer $Host1 | Set-ADAccountControl -TrustedForDelegation:$false -TrustedToAuthForDelegation:$true
        }
    }
}
25Jan/180

Fotobox – Der Bauplan für die Box

In diesem Teil meiner “Fotobox-Serie” möchte ich euch meinen Bauplan und die dahinter steckenden Überlegungen zeigen. Im letzten Teil habe ich etwas zu den Hintergründen des Projektes gesagt – wer das übersehen hat, kann es hier nachlesen:

Mein Fotobox-Projekt

In meine Vorüberlegung zur Konstruktion der Box flossen folgenden Fakten mit ein:

  • Die Abmessungen meiner Kamera
  • Die Abmessungen der von mir geplanten Displays (1x 19’’ Widescreen für die Slideshow, 1x 10’’ Widescreen für das Live-Vorschaubild von der Kamera und 1x 7’’ Widescreen für die Anleitung und andere Interaktion mit dem Benutzer
  • Die Maße weiterer zu verbauender Komponenten (Mini-PC, Stromleiste, …)
  • Der Wunsch, die Fotobox auf einem Boxenstativ aufstellen zu können und damit die Notwendigkeit, einen Boxen-Flansch zu montieren
  • Die Notwendigkeit, die Box zu kühlen, da durch PC, Displays und andere Komponenten über die Zeit reichlich Abwärme entsteht
  • Durch den Wunsch, die Box bei Nichtgebrauch zerlegen zu könne, und um das Transportgewicht zu verringern, sollten die größeren Komponenten der Box einfach entfernt werden können. Dazu…
    • …sollten die Displays auf einer Art Schiene in die Box geschoben werden können
    • …sollte die Kamera in ihrer Position und Ausrichtung leicht verändert und ebenso leicht entnommen werden können
    • …sollten die beiden Seiten der Box als eine Art Deckel und Wartungs-Zugang fungieren und leicht zu öffnen, aber auch wirksam zu verschließen sein
  • Auf dem Dach der Box sollte später die Halterung für den Blitz und den Lichtformer angebracht werden; dabei sollte sowohl ein einfacher Systemblitz als auch ein schwerer Studioblitz verwendet werden können
  • In meinen ursprünglichen Überlegungen sollte die Stromversorgung und die Verbindung zum Fußtaster über eine Öffnung im Boden der Box erfolgen, weshalb ich dort eine Kabeldurchführung, wie man sie z.B. in Tischplatten verwendet, vorgesehen habe – später habe ich das aber anders gelöst

Im Ergebnis sieht die konstruierte Box dann grob so aus:

- Auf der Vorderseite (in meiner Definition ist das die Seite, vor der die zu fotografierenden Gäste stehen) sind die Öffnung für die Kameralinse und die beiden kleineren Displays

- Auf der Rückseite ist im Wesentlichen das größere Display für die Slideshows und falls später nötig ggf. ein Ausgabeschlitz für die Fotos des Druckers

- Die linke und rechte Seite sind jeweils eine Art Deckel mit jeweils montierten Lüftern für die Kühlung

- Auf der Unterseite ist der Boxenflansch montiert und es gibt Platz für die Kabeldurchführung

- Auf der Oberseite wird eine Art Mini-Lampenstativ für den Blitz montiert

- Die Breite wird durch die Breite des 19’’-Displays bestimmt – jeweils mit etwas Rahmen links und rechts davon, damit die Konstruktion stabil ist; Außerdem sollte eine 8-fach Steckerleiste quer in die Box passen

- Die Höhe der Box wird durch die beiden kleineren übereinander montierten Displays und dem dazwischen nötigen Platz für die Linsen-Öffnung bestimmt

- Die Tiefe der Box wird einerseits durch den nötigen Platz für Kamera, WLAN-Router, Mini-PC und co. bestimmt und andererseits durch den Wunsch nach einer nicht zu schmalen Box (wegen der Stabilität)

Daraus resultieren dann die Abmessungen

  • 54cm breit
  • 40cm tief
  • 45cm hoch

Fotobox_Konstruktion_Zeichnungen_Seite1

Die Zeichnung für die Box habe ich der Einfachheit mit Microsoft Visio gemacht. Ich habe mich kurz an SketchUp Free versucht, aber hier war mir die Einstiegshürde zu hoch.

In der Zeichnung war ich noch von 20mm starkem Holz ausgegangen, verwendet habe ich dann 18mm starke Platten aus Kiefer. Alternativ kann man auch Fichte verwenden.

Fotobox_Konstruktion_Zeichnungen_Seite2

Auf der Zeichnung sind die diversen von mir verwendeten Komponenten mit ihren jeweiligen Maßen berücksichtigt. Diese müssen natürlich an die eigenen Gegebenheiten angepasst werden, wenn man die Konstruktion nachbauen will.

Und hier nun also meine Zeichnung in diversen Formaten:

Konstruktion als bearbeitbare Visio Datei

Konstruktion als PDF

23Jan/180

PowerShell – Geeigneten Host für neue VM finden

Wer kennt das nicht? Da will man eine neue VM installieren und stellt sich dabei unweigerlich folgende Frage:

Welcher meiner Hyper-V Hosts ist dafür am besten geeignet?

Klar, jetzt könnte man einfach im SCVMM nachsehen, ja gar die Bereitstellung darüber abwickeln und sich den besten Host vorschlagen lassen. Was aber, wenn man keinen SCVMM hat (so wie wir)? Dann hilft einem zum Glück die PowerShell – und mein kleines Script!

Dieses fragt alle aufgelisteten Hyper-V-Hosts nach deren Hardware-Ressourcen ab und listet diese dann auf. Dabei werden folgende Informationen ausgegeben:

  • Anzahl physischer und logischer Cores
  • Anzahl bereits verwendeter vCores
  • Verhältnis zwischen logischen und virtuellen Cores (Sollte 1:8 nicht übersteigen)
  • Vorhandener RAM gesamt
  • Belegter RAM

Im Script enthalten ist eine Funktion, die entsprechende Objekt liefert, wodurch sich das Script auch in andere Automatisierungen einbauen lässt. Ihr findet das Script als Download weiter unten. Hier erstmal das Listing:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$AllHyperVHosts = "HOST1","HOST2","HOST3","HOST4"
 
function Get-HyperVHostInfo([string]$HyperVHost)
{
 
    $vCores = ((Get-VM -ComputerName $HyperVHost).ProcessorCount | Measure-Object -Sum).Sum
 
    $Property = "numberOfCores", "NumberOfLogicalProcessors"
    $CPUs = Get-Ciminstance -class Win32_Processor -Property  $Property -ComputerName $HyperVHost| Select-Object -Property $Property 
    $Cores = ($CPUs.numberOfCores | Measure-Object -Sum).Sum
    $logCores = ($CPUs.NumberOfLogicalProcessors | Measure-Object -Sum).Sum
 
    $os = Get-Ciminstance Win32_OperatingSystem -ComputerName $HyperVHost
    $MemFreePct = [math]::Round(($os.FreePhysicalMemory/$os.TotalVisibleMemorySize)*100,2)
 
    $object = New-Object -TypeName PSObject
    $object | Add-Member –MemberType NoteProperty –Name PhysicalCores –Value $Cores
    $object | Add-Member –MemberType NoteProperty –Name LogicalCores –Value $logCores
    $object | Add-Member –MemberType NoteProperty –Name VirtualCores –Value $vCores
    $object | Add-Member –MemberType NoteProperty –Name MemTotalGB -Value ([int]($os.TotalVisibleMemorySize/1mb))
    $object | Add-Member –MemberType NoteProperty –Name MemFreeGB -Value ([math]::Round($os.FreePhysicalMemory/1mb,2))
    $object | Add-Member –MemberType NoteProperty –Name MemFreePct -Value $MemFreePct
 
    Return $object
}
 
ForEach($OneHost in $AllHyperVHosts)
{
    $HostData = Get-HyperVHostInfo -HyperVHost $OneHost
 
    Write-Host "$OneHost has $($Hostdata.PhysicalCores) physical cores, $($Hostdata.LogicalCores) logical cores and $($Hostdata.VirtualCores) virtual cores are used in all VMs overall." -ForegroundColor Yellow
    Write-Host "The Core:vCore ratio is `t`t1:$([math]::Round(($Hostdata.VirtualCores) /  ($Hostdata.PhysicalCores),2))"
    Write-Host "The Log.Core:vCore ratio is `t1:$([math]::Round(($Hostdata.VirtualCores) /  ($Hostdata.LogicalCores),2))"
    Write-Host "The system has $($Hostdata.MemFreeGB)GB of free memory and $($Hostdata.MemTotalGB)GB memory at all, which is $($Hostdata.MemFreePct)% free"
    Write-Host ""
 
}
Write-Host "The conservative approach for logical cores is `t1:8 "

Das Script als *.ps1 Datei gibt es hier:

https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-vCore-507be5dc

21Jan/180

Mein Fotobox-Projekt

Mein “kleiner Bruder” heiratet dieses Jahr. Es wird bei weitem nicht die erste Hochzeit in meinem persönlichen Umfeld sein, auch nicht die erste, auf der ich fotografiere oder eine “Photobooth” aufbaue (in 2017 habe ich 3 oder 4 Hochzeiten fotografiert, auf einer davon auch auch den ganzen Abend zusätzlich mit Photobooth). Nun war der Wunsch meines Bruders und meiner künftigen Schwägerin, auch bei den beiden eine Photobooth aufzubauen. Da die Location dieses Mal aber deutlich gehobener ist, will ich nicht mit dem bisherigen Aufbau arbeiten, bei dem ich Zeug auf Tischen stehen habe und so. Stattdessen sollte es eine “richtige Photobooth” werden. Mein Fotobox-Projekt war geboren!

Im Herbst 2017 habe ich mir einige Gedanken gemacht, was die Fotobox können soll, was sie nicht zu können braucht und wie der Aufbau aussehen könnte. Folgende Fähigkeiten waren mir dabei wichtig:

  • Alles-in-Einem-Lösung mit optisch ansprechendem Gehäuse, das sich bei längerem Nichtgebrauch zerlegen lässt
  • Unbeaufsichtigter Einsatz ohne bewegliches Material wie Fernauslöser o.ä.
  • Verwendung bereits vorhandener Foto-Komponenten soweit möglich, um die Kosten gering zu halten
  • Bedienung ohne Touchscreen oder Tastatur/Maus
  • Live-Bild von der Kamera
  • Ein Blitz auf dem “Dach”
  • Anzeige der bereits gemachten Fotos in einer Slideshow
  • Upload der Fotos auf einen Cloudspeicher

Daraus resultierte folgender Ansatz:

  • Das Gehäuse aus Vollholz zu bauen, aber weitgehend mit Maschinenschrauben und Muttern zu arbeiten
  • Meine vorhandene Sony A65 D-SLR (SLT) als Kamera zu verwenden
  • Einen Mini-PC mit entsprechender Software laufen zu lassen
  • Vorerst auf einen Drucker zu verzichten, aber Platz für meinen Canon Selphy zu lassen, falls später nötig
  • 3 Monitore zu verbauen:
    • Einen für das Live-Bild von der Kamera
    • Einen für Anleitung/Bedienung und das letzte geschossene Bild
    • Einen für die Slideshow
  • Eine Fußtaster zum auslösen benutzen

26001324_1765060113513757_6851081348184229644_n

Bedingt durch die Tatsache, dass meine Sony A65 selber kein WLAN hat und sich auch nicht per USB sinnvoll steuern lässt, musste ich auf eine Toshiba FlashAir WiFi SD-Karte zurückgreifen. Damit kann man jede beliebige Kamera WLAN-fähig machen. Und da sich die Karte auch sehr umfangreich anpassen lässt, ist die Benutzung auch sehr zuverlässig.

Da ich nun mit den meisten Arbeiten fertig bin, möchte ich euch in den folgenden Blog-Posts über die Details meiner Arbeit informieren. Wer Fragen zur Box hat, darf sich gerne an mich wenden!

13Jan/180

PowerShell Core 6.0: Generally Available (GA)

Wie Microsoft vor wenigen Tagen berichtet hat (siehe Blogartikel), ist PowerShell Core 6.0 seit dem 10.01.2018 GA und wird von Microsoft voll supported!

Den Download für PowerShell Core 6.0 findet man hier:

PowerShell Core für Windows

PowerShell Core für Linux / macOS

Microsoft empfiehlt das Entfernen alter PS Core Versionen und eine saubere Neuinstallation:

sudo apt remove powershell && sudo apt-get install powershell

Die Liste der unterstützen Betriebssysteme ist lang:

  • Windows 7, 8.1, and 10
  • Windows Server 2008 R2, 2012 R2, 2016
  • Windows Server Semi-Annual Channel
  • Ubuntu 14.04, 16.04, and 17.04
  • Debian 8.7+, and 9
  • CentOS 7
  • Red Hat Enterprise Linux 7
  • OpenSUSE 42.2
  • Fedora 25, 26
  • macOS 10.12+

Wichtig ist ein Hinweise am Ende des Artikels:

Windows PowerShell 3.0, 4.0, and 5.1 will continue to be supported on supported versions of Windows and Windows Server.
(Note: While Windows PowerShell 2.0 is still in support, it has been deprecated, and it’s recommend that workloads be migrated to newer versions of PowerShell.)

Für Windows PowerShell ab Version 3.0 gibt es also weiterhin Support – aber Neuerungen/Verbesserungen darf man hier wohl nicht mehr erwarten.

Viel Spaß beim Ausprobieren!