Warum schaltet sich dieser verdammte DHCP-Dienst am Windows Server ständig ab? Was hat das mit IPv6 zu tun?

5 Dezember 2016

Irgendwie stand ich gerade auf dem Schlauch und hab mich mit einem Problem länger als nötig beschäftigt um am Ende festzustellen, die Lösung ist logisch und ganz einfach. Es ging los, dass bei einem Kunden der Speedport gegen eine Fritzbox ausgetauscht werden sollte.

Zu Beginn war alles ganz einfach, Internetverbindung war schnell da. Aber dann gab es Probleme im Netz mit den Client-Rechnern nach einem Neustart. Dazu muss man wissen, dass bei der Fritzbox der IPv4-DHCP ausgeschaltet wurde. Egal wie oft man nun am Windows Server den DHCP-Server neu gestartet hat, er funktionierte immer kurz und war dann wieder ausgeschaltet. Sowas kennt man wenn ein zweiter DHCP-Server im Netz ist. Also nochmal auf der Fritzbox versichert, dass der Ipv4-DHCP ausgeschaltet war. Am Ende war nur noch der Server mit dem Client mit der Fritzbox verbunden. Klappte aber immer noch nicht!

Wo schaut man nach, wenn man solche Probleme hat? Richtig, in der Ereignisanzeige. Also kurz nach den DHCP-Server Logs geschaut:

Get-WinEvent -ListLog *dhcp*|select logname

LogName
——-
Microsoft-Windows-Dhcp-Client/Admin
Microsoft-Windows-Dhcp-Client/Operational
Microsoft-Windows-Dhcp-Server/FilterNotifications
Microsoft-Windows-Dhcp-Server/Operational
Microsoft-Windows-DhcpNap/Admin
Microsoft-Windows-DhcpNap/Operational
Microsoft-Windows-Dhcpv6-Client/Admin
Microsoft-Windows-Dhcpv6-Client/Operational

Ah alles klar:

Get-WinEvent -LogName Microsoft-Windows-Dhcp-Server/Operational -MaxEvents 10

TimeCreated                   ProviderName                                             Id Message
———–                   ————                                             — ——-
17.12.2015 12:52:43           Microsoft-Windows-DHCP-Server                           106 Die Rese
17.12.2015 12:52:43           Microsoft-Windows-DHCP-Server                           107 Die Rese
17.12.2015 12:49:25           Microsoft-Windows-DHCP-Server                           106 Die Rese
17.12.2015 12:48:23           Microsoft-Windows-DHCP-Server                           107 Die Rese
25.11.2015 09:12:51           Microsoft-Windows-DHCP-Server                           106 Die Rese
25.11.2015 09:12:24           Microsoft-Windows-DHCP-Server                           107 Die Rese
21.05.2014 14:25:11           Microsoft-Windows-DHCP-Server                           106 Die Rese

Wie 2015? Ich hab aktuell Problem und nicht 2015! Hä? Was geht hier. Auf jeden Fall ist es wie immer man sucht überall aber nicht an der richtigen Stelle!!!!

Irgendwann dachte ich, dass kann nicht sein und klar es war so. Denn man sollte ja auch wegen DHCP-Server Meldungen nicht bei Microsoft-Windows-DHCP-Server schauen sondern unter SYSTEM!!!! Ich könnte so kotzen…

Also mittels

Get-WinEvent -LogName system -MaxEvents 20

TimeCreated                   ProviderName                                             Id Message
———–                   ————                                             — ——-
05.12.2016 14:52:32           Service Control Manager                                7040 Der Starttyp des Diensts "…
05.12.2016 14:50:02           Microsoft-Windows-GroupPolicy                          1500 Die Gruppenrichtlinieneins…
05.12.2016 14:50:01           Microsoft-Windows-GroupPolicy                          1500 Die Gruppenrichtlinieneins…
05.12.2016 14:49:56           Service Control Manager                                7036 Dienst "Windows Modules In…
05.12.2016 14:49:25           Microsoft-Windows-DHCP-Server                          1043 Es wurde festgestellt, das…
05.12.2016 14:49:05           Service Control Manager                                7036 Dienst "DHCP-Server" befin…
05.12.2016 14:49:01           Microsoft-Windows-DHCP-Server                          1056 Der DHCP-Dienst wird auf e…
05.12.2016 14:45:31           Service Control Manager                                7036 Dienst "DHCP-Server" befin…
05.12.2016 14:45:31           Microsoft-Windows-DHCP-Server                          1054 Der DHCP/BINL-Dienst auf d…
05.12.2016 14:45:31           Microsoft-Windows-DHCP-Server                          1053 Der DHCP/BINL-Dienst hat e…
05.12.2016 14:45:19           Service Control Manager                                7036 Dienst "DHCP-Server" befin…
05.12.2016 14:45:15           Microsoft-Windows-DHCP-Server                          1056 Der DHCP-Dienst wird auf e…
05.12.2016 14:45:03           Microsoft-Windows-GroupPolicy                          1500 Die Gruppenrichtlinieneins…

geschaut und hier tauchen dann auch die üblichen Verdächtigen DHCP/BINL-Meldungen auf! Wenn man nun genauer nachschaut, wird es auch offensichtlich:

Get-WinEvent -LogName system -MaxEvents 20| where {$_.id -eq 1053}| ft message -Wrap

Message
——-
Der DHCP/BINL-Dienst hat einen anderen Server mit der IP-Adresse fe80::3a10:d5ff:fe89:bb02 in diesem Netzwerk ermittelt
, der zu der folgenden Domäne gehört: .

Also wo liegt nun das Problem? Warum hab ich oben immer geschrieben, dass ich den IPv4DHCP ausgeschaltet habe? Na klar, weil die Fritzbox auch noch einen IPv6DHCP hat und dieser munter weiter aktiv war. Und da im Netz nunmal unabhängig von IPv4 und IPv6 nur ein DHCP aktiv sein war, hat sich der Windows DHCP-Server immer schneller verabschiedet!

Also Lösung: Entweder IPv6 ganz abschalten oder den IPv6DHCP abschalten! Besser ist natürlich die zweite Variante.

Mal abgesehen davon, dass ich hätte schneller drauf kommen können. ist mir erst durch diese Geschichte wieder aufgefallen, wie inkonsistent die DHCP-Dienst-Sache unter Windowsservern ist. Einfach nur traurig…

UEFI Boot und Probleme ins BIOS/UEFI zu kommen

3 Dezember 2016

Bei aktuellen Rechnern mit ihren superschnellen Bootvorgängen kann es schon schwierig werden ins BIOS bzw. UEFI zu kommen. Man hämmert wie blöde auf irgendwelche F-Tasten, die man manchmal schon gar nicht mehr auf der Tastatur hat, um dann später festzustellen, es war die falsche oder man war mal wieder zu langsam. Hier eine Aufstellung von möglichen Tasten: http://www.isunshare.com/windows-password/how-to-set-your-computer-to-boot-from-usb-drive.html#opt4.

Windows
Für obiges Problem gibt es seit Windows 8 Abhilfe. Man konnte seither unter den PC-Einstellungen->Update und Sicherheit->Wiederherstellung den Erweiterten Start aufrufen. Da konnte man dann meist den Eintrag UEFI-Firmware Einstellungen unter Problembehandlung->Erweiterte Optionen aufrufen oder die Starteinstellungen ändern. Diese Möglichkeit ist gut aber als bekennender Commandliner nicht sehr befriedigend.

Nun hat Microsoft bereits bei Windows 8 beim Shutdownbefehl den Parameter /o eingeführt. Dieser kürzt die Sache deutlich ab und man gelangt direkt in den Bildschirm mit den Erweiterten Startmöglichkeiten. So gehts:

shutdown /r /o

Wer sich nun unter Windows 10 v1607 die Parameter des Shutdown-Befehls anschaut, der stellt fest, es gibt nun auch einen Parameter /fw, welcher für Firmware steht und Firmware steht wiederum für die ganze UEFI-Geschichte. Man kann also mittels

shutdown /r /fw

direkt in die UEFI-Einstellungen booten! Endlich ein sauber gesteuerter Zugriff ohne zig unnötige Menüs zwischendrin!

Übrigens noch ein Tipp: Es gibt Situationen, da hat man SetHC.EXE oder UTILMAN.EXE umgebogen. Hier ein Beispiel dafür: https://newyear2006.wordpress.com/2015/08/30/abgelaufene-aktivierungen-erschweren-einem-das-leben-unter-windows/. In diesem Fall funktioniert shutdown /r /o z. B. nicht. Man kann sich jedoch behelfen, wenn man statt shutdown /o einfach

reagentc.exe /boottore

verwendet. Hat den gleichen Effekt, funktioniert aber bisher in allen Situationen! Einzige Voraussetzung dafür ist ein korrekt eingerichtetes RecoveryEnvironment. Infos dazu erhält man über reagentc /info.

Linux
Wer nun mit Linux unterwegs ist welches bereits SystemD nutzt, der kommt mit diesem Befehl in die UEFI-Einstellungen:

systemctl reboot --firmware-setup

Hier noch ein paar erhellende Infos zu UEFI unter Linux, vor allem, wie man Firmwarevariablen erzeugen kann und wie man darauf zugreift: https://firmware.intel.com/blog/accessing-uefi-variables-linux.

Ein weiterer interessanter Link für Linux und UEFI: http://superuser.com/questions/519718/linux-on-uefi-how-to-reboot-to-the-uefi-setup-screen-like-windows-8-can.

Microsoft Schwachmaten mal wieder at it’s best! Tschüss Einmalcodes

26 November 2016

Wenn ich auf fremden Rechnern unterwegs bin und mit Microsoft Diensten Kontakt aufnehme, dann melde ich mich grundsätzlich mittels des sogenannten Microsoft Einmalcodes an. Dabei gebe ich meine Handynummer an und erhalte dann zum Login eine Nummer per SMS. Dies ist der sogenannte Einmalcode oder Single Use Code.

Scheinbar ist diese Funktion seit kurzem nicht mehr überall verfügbar. So lassen sich einzelne Anfragen im Netz dazu finden.

http://www.win-10-forum.de/outlook-com/20869-anmeldung-einmalcode-verschwunden.html

http://www.gutefrage.net/frage/anmeldung-mit-einmalcode-verschwunden-kein-login-mit-sms

Es gab aber nirgends eine Info zu finden, dass die Funktion eingestellt wurde. In der Knowledge Base gibt es diesen Artikel vom Juni 2016: https://support.microsoft.com/en-us/help/10552/microsoft-account-sign-in-single-use-code.

Fakt ist nur, dass aktuell der Einmalcode nicht verfügbar ist und wenn obige Links stimmen, fehlt die Funktion seit Anfang Oktober 2016.

Nach einigem Probieren bin ich dann aber doch noch fündig geworden. Nachdem ich https://account.activedirectory.windowsazure.com aufgerufen hatte, konnte ich mich mittels Einmalcode anmelden. Anschließend konnte ich dann Outlook.com aufrufen und war bereits angemeldet.

DANKE Microsoft für diesen tollen Schritt, damit habt ihr mal wieder deutlich Eure Bilanz aufpoliert und könnt wieder mehr Kohle sparen. Ihr habt wieder einmal mehr den Benutzern die Arschkarte gezeigt! Weiter so! Wer braucht schon Sicherheit, man hat ja den SDL…

Nuget-Pakete direkt in Powershell benutzen

19 November 2016

Powershell und Nuget, ein schwieriges Thema wenn man mit diesen beiden Begriffen auf Google losgeht. Man findet massenhaft Treffer aber die meisten handeln um Powershell+Nuget+Visual Studio. In diesem Artikel möchte ich beschreiben, was man tun muss um Nuget-Pakete, die üblicherweise für C# bzw. das .Net-Framework erstellt wurden, in Powershell nutzen zu können. Konkret geht es darum Pakete die unter https://www.nuget.org/packages zu finden sind direkt unter Powershell nutzbar zu machen.

Hat man ein aktuelles Windows 10 System mit Powershell 5.1 dann bekommt man automatisch das PackageManagement-Modul mitgeliefert. Allerdings hat man zu Anfang nur Zugriff auf PSGallery. Damit man auf die große Welt der Nuget-Pakete zugreifen kann, muss man einen PacketSource für Nuget hinzufügen. Dazu benötigt man den Einsprungspunkt für die Nuget-Paketauflistung. Dieser ist direkt unter https://www.nuget.org/ zu finden.

Dort sind momentan die beiden Feeds

NuGet feed v3 (VS 2015 / NuGet v3.x): https://api.nuget.org/v3/index.json

NuGet feed v2 (VS 2013 and earlier / NuGet 2.x): https://www.nuget.org/api/v2

aufgeführt. Welchen von beiden soll man verwenden? Man kann sich an der Nuget-Version, welche Powershell verwendet orientieren. Dazu fragt man einfach

Get-PackageProvider –Name Nuget

ab. Dort wird momentan Version 2.8.5.208 geliefert. Also verwendet man den v2 Feed. Dies geschieht durch hinzufügen eines PacketSource mit der v2-Feed-Adresse:

Register-PackageSource –Name MyNuget  –Location "https://www.nuget.org/api/v2" –Providername Nuget

Beim ersten Aufruf erfolgt eine Rückfrage:

Der Anbieter "nuget v2.8.5.208" ist nicht installiert.
"nuget" kann manuell von https://oneget.org/Microsoft.PackageManagement.NuGetProvider-2.8.5.208.dll heruntergeladen und installiert werden.
Soll PackageMangement automatisch heruntergeladen und "nuget" jetzt installiert werden?

Diese sollte man mit J beantworten. Anschließend kann man auf die Nugetpaketsammlung zugreifen:

Find-Package –Source MyNuget –Name *Mail*

Damit bekommt man alle vorhandenen Pakete die im Namen Mail enthalten aufgelistet.

IP-Adresse von WSD-Drucker per Powershell ermitteln

9 November 2016

Offensichtlich gibt es keine einfache Methode die IP-Adresse eines WSD-Druckers per Eingabeaufforderung zu ermitteln. Per GUI ist es klar, dass man in der Systemsteuerung bei Geräte und Drucker bei den Eigenschaften (nicht Druckereigenschaften) fündig wird. Leider wird bei Windows 10 in der Modernen Oberfläche aber auch diese Sache ausgespart. Wäre es nicht schön so eine wichtige Information direkt per Commandline zu bekommen?

Zunächst brauchen wir einen Drucker,  jeder sollte sich hier seinen eigenen WSD-fähigen Drucker aussuchen:

$printer=Get-Printer|out-gridview –passthru

Die weitere Beschreibung macht aber nur Sinn, wenn man einen WSD-fähigen Drucker hat. Wobei alle modernen Drucker mit Netz- oder WLAN-Anschluss dies unterstützten. Es funktioniert nicht, wenn der Drucker per USB angeschlossen ist!

Nun brauchen wir vom Drucker den Druckerport über den die Kommunikation läuft und vom Druckerport brauchen wir den Universal Resource Name:

$deviceURN = (Get-PrinterPort -Name $printer.PortName).DeviceUUID

Damit bekommt man dann sowas zurück: URN:UUID:6D4FF0CE-6B11-11D8-8020-001E8F1CF942. Mit dieser Information kann man noch nicht viel anfangen aber es ist eine eindeutige ID, welche nur dem spezifischen Drucker, weltweit einmalig zugeordnet ist. Mit dieser ID kann man nun in der Registrierung unter HKEY_LOCAL_MACHINE:\SYSTEM\CurrentControlSet\Enum\SWD\DAFWSDProvider\ fündig werden:

$location =  (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Enum\SWD\DAFWSDProvider\$deviceURN" –Name LocationInformation).LocationInformation

In $location steht nun bereits die IP-Adresse und sieht z. B. so aus: http://192.168.0.138:80/wsd/mex. Fast am Ziel, man kann nun die IP-Adresse ganz einfach extrahieren:

([System.UriBuilder]::new($location)).host

Nun hat man endlich die IP-Adresse des Druckers. Um das alles etwas zu vereinfachen hier eine kleine Funktion:

Function Get-IPAddressFromWSDDevice ($Printer) {

$deviceURN = (Get-PrinterPort -Name $printer.PortName).DeviceUUID
$location =  (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Enum\SWD\DAFWSDProvider\$deviceURN" –Name LocationInformation).LocationInformation
([System.UriBuilder]::new($location)).host

}

Noch ein Hinweis. Da leider die passenden Cmdlets erst ab Windows 8 aufwärts verfügbar sind, wird diese Methode nicht auf Windows 7 funktionieren. Die hier gezeigte Variante funktioniert übrigens auch bei IPv6-Adressen.

Laufwerk unter Windows auf mögliche Probleme prüfen

31 Oktober 2016

Wann gibt das Laufwerk seinen Geist auf? Sei es eine herkömmliche Festplatte, SSD oder NVME alle sprechen Sie das sogenannte S.M.A.R.T-Protokoll. Damit können Probleme und mögliche Laufwerksausfälle frühzeitig erkannt werden.

Seither müsste man dazu immer irgendwelche Tools laden oder im UEFI/BIOS nachschauen. Wenn man Glück hatte, hat einen der Rechner beim Booten auf etwaige anstehende Probleme aufmerksam gemacht.

Cool ist, dass Windows, mal wieder mittels WMI eine ganz einfache Abfragemöglichkeit mitbringt:

$Para=@{Namespace="root\wmi"
Class="MSStorageDriver_FailurePredictStatus"
ErrorAction="Silentlycontinue"}

Get-WmiObject @Para | Select InstanceName, PredictFailure,
Reason | Format-Table –Autosize

Ausgegeben wird dann sowas:

InstanceName   : SCSI\Disk&Ven_Samsung&Prod_SSD_840_EVO_750G\4&15828421&0&000000_0

PredictFailure : False

Reason         : 0

InstanceName   : SCSI\Disk&Ven_Samsung&Prod_SSD_840_EVO_750G\4&15828421&0&010000_0

PredictFailure : False

Reason         : 0

InstanceName   : SCSI\Disk&Ven_&Prod_ST95005620AS\4&15828421&0&020000_0

PredictFailure : False

Reason         : 0

Solange bei PredictFailure False dran steht, ist alles ok.

Weitere Infos findet man hier: https://blogs.msdn.microsoft.com/san/2011/08/11/have-you-ever-wanted-to-know-if-your-disk-is-going-to-fail-before-it-does/

Postscript direkt an Drucker unter Windows senden

28 Oktober 2016

Im Reigen mit dem direkten Drucken von Daten an Drucker unter Windows steht als nächstes dass direkte Drucken von Postscript auf dem Programm. Durch die hier https://newyear2006.wordpress.com/2016/10/17/direkte-kommunikation-mit-druckern-unter-windows-von-powershell-aus/ vorgestellte Methode um Druckern direkt Daten unterjubeln zu können und die hier https://newyear2006.wordpress.com/2016/10/27/direktes-drucken-von-pdf-dateien-unter-windows-und-wie-man-die-farbprofiluntersttzung-eines-druckers-testen-kann/ vorgestellte Methode um direkt PDF-Dateien zu drucken, wollen wir uns nun Postscript zuwenden. Man kann davon ausgehen, dass ein Drucker welcher bereits die PDF-Ausgabe beherrscht auch die Ausgabe von Postscript kann.

Zunächst, wie beim Artikel beim Druck der PDF-Dateien beschrieben (siehe dort für mehr Details), muss die Printer Language gesetzt werden, diesmal aber anstatt PDF auf Postscript:

# {ESC}%-12345X
$kb=@(27,37,45,49,50, 51, 52, 53, 88)
# Zeilenumbruch
$lfb=@(13, 10)
# Sprache einstellen:
$lb=[System.Text.Encoding]::ASCII.GetBytes("@PJL ENTER LANGUAGE = Postscript")

So jetzt brauchen wir auch etwas Postscript:

$pss=@"
/Times-Roman findfont
32 scalefont
setfont
100 200 translate
45 rotate
2 1 scale
newpath
0 0 moveto
(Testausdruck) true charpath
0.5 setlinewidth
0.4 setgray
stroke
showpage
"@

Die Erklärung zu diesem Meisterwerk findet man hier unter Text (Example4): http://paulbourke.net/dataformats/postscript/.

Dieses Postscript muss nun noch in ein Bytearray umgewandelt werden und schon kann es an den Drucker gesendet werden:

$ps=[System.Text.Encoding]::ascii.GetBytes($pss)
$out = $kb + $lb + $lfb + $ps + $kb

$p=Get-Printer|Out-GridView -PassThru -Title "Bitte Postscript Drucker wählen"
Out-RawPrinter -Printer $p -ByteArray $out -DocTitle "Postscript Direktdruck!"

Da Postscript im Prinzip eine vollständige Programmiersprache ist, kann man auch rekursive Programme ausführen um z. B. Fraktale zu generieren:

$pss=@"

%!PS-Adobe-1.0
%%Title:Random Fern
%%Creator:Eric Wicklund
% Last modified: MLO 02 Jan 1993 11:24:14
% Changed: 'save' and 'restore' statements (incorrect grammar);
% length added, and set to 0.001 (0 does not work with Post 1.7).
/m1 [ 0.00 0.00 0.00 0.16 0.00 0.00 ] def
/m2 [ 0.85 -0.04 0.04 0.85 0.00 1.60 ] def
/m3 [ 0.20 0.23 -0.26 0.22 0.00 1.60 ] def
/m4 [ -0.15 0.26 0.28 0.24 0.00 0.44 ] def
/point 72 def
%/length 0 def
/length 0.001 def
%%EndProlog
%%Page: 1 1
/zzz save def
% will draw inside a 8 inch square centered on 8.5 by 11 inch page
4.25 point mul 1.5 point mul translate
0.8 point mul dup scale
% x coordinate ranges from -5 to 5
% y coordinate ranges from 0 to 10
1 setlinecap
0.005 setlinewidth
% First point at origin
0 0
150000 {
% Pick a transformation matrix probabilistically
   /r rand 100 mod def
   r 1 lt { /m m1 def }
 { r 86 lt { /m m2 def }
 { r 93 lt { /m m3 def }
           { /m m4 def } ifelse } ifelse } ifelse
% Make a linear transformation, then
% plot a point at current location
   m transform 2 copy moveto
   length length rlineto
   stroke
} repeat
showpage
zzz restore
%%Trailer

"@
Das Script für den Baum stammt von hier: 
http://www.pvv.ntnu.no/~andersr/fractal/PostScript.html
Wer sich beim Thema Postscript und Fraktale vertiefen möchte, dem sei 
dieses Dokument “Julia fractals in PostScript” von Kees van der Laan
empfohlen: https://www.ntg.nl/maps/45/03.pdf.
Mhh, da kommt mir eine Idee. Wenn es Grafikkarten gibt, die für 
Berechnungen herangezogen werden, warum dann nicht auch Drucker?

Direktes Drucken von PDF-Dateien unter Windows und wie man die Farbprofilunterstützung eines Druckers testen kann

27 Oktober 2016

Es gibt viele Möglichkeiten Dateien unter Windows auszudrucken. Das witzige ist, dass oft Dateien mehrfach aufbereitet werden, bis sie überhaupt am Ende beim Drucker landen. Wäre es nicht toll, wenn man z. B. eine PDF-Datei zum Drucken hätte, wenn man diese unter Umgehung des Druckertreibers direkt an den Drucker senden könnte?

Wie man RAW-Dateien direkt an einen Drucker unter Windows senden kann, wurde bereits hier beschrieben: https://newyear2006.wordpress.com/2016/10/17/direkte-kommunikation-mit-druckern-unter-windows-von-powershell-aus/. Diese Variante kann man nun ausbauen, um eben auch PDF-Dateien ohne weitere Zwischenbearbeitung drucken zu können. Natürlich funktioniert diese Methode nur, wenn der Zieldrucker auch PDF-Dateien direkt verarbeiten kann! Im Zweifel gilt probieren über studieren.

Wir brauchen also die Funktion Out-RAWPrinter aus dem oben verlinkten Blogartikel. Dann müssen wir die PDF-Datei laden:

$pdf = Get-Content –Path C:\Temp\Test.PDF –Encoding Byte

$pdf enthält nun ein Bytearray. Leider lässt sich dies noch nicht direkt an Out-RawPrinter übergeben, denn dem Drucker muss noch mitgeteilt werden, welche Sprache bzw. Dateiformat da kommt. Dies ist aber ganz einfach über die Printer Job Language PJL möglich. Hier die Referenz dazu: http://h20565.www2.hp.com/hpsc/doc/public/display?docId=emr_na-bpl13208. Erfunden wurde die PJL von HP, wird aber mittlerweile auch von anderen Druckerherstellern verwendet bzw. verstanden.

In unserem Fall soll die Sprache auf PDF gestellt werden. Dies erreicht man, indem man @PJL ENTER LANGUAGE = PDF an den Drucker sendet. Damit der Drucker aber auch darauf achtet und reagiert muss noch seine Aufmerksamkeit durch einen spezielle Zeichenfolge erregt werden, indem man {ESC}%-12345X vorab und hinterher sendet. In Kombination sieht das dann so aus:

# {ESC}%-12345X
$kb=@(27,37,45,49,50, 51, 52, 53, 88)
# Zeilenumbruch
$lfb=@(13, 10)
# Sprache einstellen:
$lb=[System.Text.Encoding]::ASCII.GetBytes("@PJL ENTER LANGUAGE = PDF")
# alles Zusammensetzen
$out = $kb + $lb + $lfb + $pdf + $kb

In $out steht nun das komplette Bytearray. Das sieht dann z. B. so aus:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

1B 25 2D 31 32 33 34 35 58 40 50 4A 4C 20 45 4E  .%-12345X@PJL EN
54 45 52 20 4C 41 4E 47 55 41 47 45 20 3D 20 50
  TER LANGUAGE = P
44 46
0D 0A
25 50 44 46 2D 31 2E 34 0D 0A 25 E2  DF..%PDF-1.4..%â
E3 CF D3 0D 0A 25 0D 0A 25 77 50 44 46 33 20 62  ãÏÓ..%..%wPDF3 b
79 20 57 50 43 75 62 65 64 20 47 6D 62 48 20 56  y WPCubed GmbH V
33 2E 36 35 5B 34 30 32 36 35 33 32 31 36 5D 20  3.65[402653216]

am Ende so:

65 65 30 63 31 32 32 62 64 32 66 38 63 34 3E 5D  ee0c122bd2f8c4>]
0D 0A 2F 49 6E 66 6F 20 32 20 30 20 52 0D 0A 3E  ../Info 2 0 R..>
3E 0D 0A 73 74 61 72 74 78 72 65 66 0D 0A 31 39  >..startxref..19
37 32 35 31 0D 0A 25 25 45 4F 46 0D 0A 1B 25 2D  7251..%%EOF...%-
31 32 33 34 35 58
                                12345X

Und jetzt noch alles an den Drucker:

$p=Get-Printer|Out-GridView -PassThru -Title "Bitte Drucker wählen"
Out-RawPrinter -Printer $p -ByteArray $out -DocTitle "PDF Direktdruck!"

Verwendet man diese Methode, muss man aber damit rechnen, dass der Ausdruck manchmal anders aussieht, als erwartet. Denn PDF ist nicht immer gleich PDF, bzw. PDF kann je nach Gerät unterschiedlich interpretiert werden.

Was kann man damit anstellen? Ja man könnte sein Gerät z. B. auf direkte Kompatibilität von ICC v4 Profil Farbraumunterstützung testen http://www.color.org/version4pdf.pdf.

$iccv4=(Invoke-WebRequest -Uri http://www.color.org/version4pdf.pdf).Content
$out = $kb+$lb+$lfb+$iccv4$x+$kb
$p=Get-Printer|Out-GridView -PassThru -Title "Bitte Drucker wählen"
Out-RawPrinter -Printer $p -ByteArray $out -DocTitle "PDF Direktdruck!"

Spannend so eine Sache!

Probleme mit Exchange, IMAP, POP3, SMTP, Outlook, Office365 usw. mit dem Microsoft Remote Connectivity Analyzer aufspühren

26 Oktober 2016

Mittels diesem Link kann man bei Microsoft verschiedene Dienste testen, ob diese generell funktionieren. Man muss zwar sein Zugangsdaten eingeben, aber was macht man nicht alles in verzweifelten Situationen, wenn gar nichts mehr geht.

https://testconnectivity.microsoft.com/

Windows Server Script zum Abschalten von unsicheren SSL und TLS Verbindungen

23 Oktober 2016

Gerade bin ich über ein schönes Powershellscript gestolpert um einen Windows Server die anfälligen SSL und TLS Protokolle und unsicheren Ciphers abzuschalten.

https://www.hass.de/content/setup-your-iis-ssl-perfect-forward-secrecy-and-tls-12

Wird schön gepflegt und auf dem aktuellen Stand gehalten. Das einzige was mich daran stört: Es wäre schön zu sehen, welcher Wert geändert wurde, damit man bei Problemen schneller nachvollziehen kann, welches Protokoll bzw. welche Cipher doch noch benötigt wird.