Powershell-Skripte mit Dateien aus dem Windows Explorer mittels Drag&Drop versorgen

12 August 2016

Man wundert sich immer wieder, dass unter Windows die Drag&Drop-Methode seltener zum Einsatz kommt als z. B. bei Mac-Benutzern. Während für viele Mac-Benutzer dies zum täglichen Brot gehört, tun sich Windows Benutzer oft damit schwer, wohl auch aus der Erfahrung heraus, dass bestimmte logische Drag&Drop-Kombinationen einfach nicht funktionieren. Woran liegt dies? An den faulen Programmierern! Um dieser Sache einen Riegel vorzuschieben, hier eine Beschreibung wie man Powershell-Skripte Drag&Drop fähig bekommt.

Folgende Ausgangssituation. Man hat ein sinnvolles Powershell-Skript, welches auf bestimmte Dateien angewendet werden soll. Man könnte nun unter Powershell das Skript schreiben und dem Benutzer sagen, er soll die betreffenden Dateien als Arrayparameter übergeben. Der kuckt einen blöd an und sagt: Bahnhof.

Um dem unbedarften Benutzer die Möglichkeit zu bieten bestimmte Powershell-Skripte auf bestimmte Dateien anzuwenden sollte die Sache über den Windows-Explorer funktionieren. D. h. der Benutzer markiert die gewünschten Dateien und zieht – also per Drag&Drop eine oder mehrere auf das Powershell-Skript und lässt sie dort los. Das Skript bekommt die ausgewählten Dateien als Parameter übergeben und kann seiner Arbeit nachgehen.

Von Hause aus ist dies leider in Powershell nicht vorgesehen. Aber mit einem kleinen Trick und Umweg über Batch-Dateien klappt es dann doch. Dazu benennt man am einfachsten die Batch-Datei wie die Datei mit dem Skript, nur anstatt der Endung .PS1 hat man eben .BAT  oder .CMD.

@ECHO OFF
REM Powershellscript.bat
REM
SET PSScript=%~dpn0.ps1
SET PSScriptPath=%~dp0
SET args=’%1′
:More
SHIFT
IF ‚%1‘ == “ GOTO Done
SET args=%args%,’%1′
GOTO More
:Done
REM funktioniert nur, wenn .BAT gleichen Dateinamen wie .PS1-Datei hat:
Powershell.exe -noprofile -noexit -command ". {$count=0; foreach($file in %args%) {. %PSScript% $file; $count++ }; ‚Processed ‚ + $count; }"

Hat man also das Skript MeinPowershellskript.PS1 und möchte dieses mittels Drag&Drop mit Dateien aus dem Windows Explorer befeuern, dann muss auch obige Batchdatei mit dem Namen MeinPowershellskript.BAT im selben Verzeichnis existieren. Der Benutzer zieht die Dateien auf die .BAT-Datei und nicht auf die .PS1-Datei!

Das Powershell-Skript kann dann mittels der immer verfügbaren Variablen $args die übergebene Datei abfragen und darauf reagieren, z. B. so:

"Datei zum Bearbeiten: $args[0]"
Read-Host "Return zum Beenden drücken"

Werden mehrere Parameter übergeben:

$Index=0
foreach($arg in $args) {
  "$(($Index++)): $arg"
}
Read-Host "Return zum Beenden drücken"

Im obigen Beispiel wird das Powershell-Skript für jede zu bearbeitende Datei separat hintereinander aufgerufen. Manchmal kann es dabei sinnvoll sein, den Pfad zu kennen, wo das Skript liegt. Um dies dem Powershell-Skript mitteilen zu können, kann man den Aufruf des Skripts etwas ändern, aus

{. %PSScript% $file; $count++ }

in

{. %PSScript% $file %PSScriptPath%; $count++ }

Warum aber die Skripte einzeln ausführen und nicht alle Dateien auf einen Schlag übergeben? Bei zu vielen Dateien geht die Eingabeaufforderung in die Knie und bringt blöder Fehlermeldungen, deshalb dieser Weg. Etwas langsamer und umständlicher aber dafür zuverlässiger.

Weitere Infos:

http://stackoverflow.com/questions/2819908/drag-and-drop-to-a-powershell-script

Invocation-Context:
http://gallery.technet.microsoft.com/scriptcenter/cb72e4e6-4a68-4a2e-89b7-cc43a860349e#content

Informationen zu einer Linux Version bzw. Linuxbox ermitteln

7 August 2016

Linux ist extrem weit verbreitet. Fast jedes Gerät mit einem Netzwerkanschluss hat meist irgendeine Form von Linux enthalten. Wenn man nun per Telnet oder SSH vor einer Konsole sitzt, stellt sich oft die Frage, mit was man es zu tun hat. In Windows würde man

C:>systeminfo|findstr /C:"Betriebs" /C:"OS" /C:"System"
Betriebssystemname:                            Microsoft Windows 10 Pro
Betriebssystemversion:                         10.0.14393 Nicht zutreffend Build 14393
Betriebssystemhersteller:                      Microsoft Corporation
Betriebssystemkonfiguration:                   Eigenst?ndige Arbeitsstation
Betriebssystem-Buildtyp:                       Multiprocessor Free
Systemstartzeit:                               04.08.2016, 19:43:55
Systemhersteller:                              Microsoft Corporation
Systemmodell:                                  Virtual Machine
Systemtyp:                                     x64-based PC
BIOS-Version:                                  Microsoft Corporation Hyper-V UEFI Release v1.0, 26.11.2012
System-Verzeichnis:                            C:\Windows\system32
Systemgebietsschema:                           de;Deutsch (Deutschland)

aufrufen um zu wissen wo man sich befindet. In Linux ist dies nicht so einfach. Je nach Distribution gibt es unterschiedliche Wege die Versionen zu ermitteln aber es gibt dennoch ein paar Stellen, wo man es herausfinden kann.

Die meisten Linuxdistributionen speichern Infos in der issue-Datei im etc-Verzeichnis, welche mit cat ausgeben kann:

cat /etc/issue
Ubuntu 14.04.5 LTS \n \l

Damit ist bereits die grobe Richtung bekannt. Bei einem Raspberry Pi sieht die Sache so aus:

cat /etc/issue
Raspbian GNU/Linux 8 \n \l

Hier fangen die Schwierigkeiten mit Linux und den Distributionen an. Denn es gibt so viele unterschiedliche Distributionen. Hier ein weiteres Beispiel:

cat /etc/issue
vuplus 3.0.0 \n \l

In diesem Fall weiß ich, dass ich auf einer Vu+, einem Mediaplayer unterwegs bin. OK, vuplus ist eine eigene Distribution aber um weitere Möglichkeiten besser einschätzen zu können, wäre es wichtig die verwendete Linuxversion bzw. Kernelversion herauszufinden. Hierzu kann man /proc/version abfragen:

Unter Ubuntu liefert dies z. B.:

cat /proc/version
Linux version 3.4.0-Microsoft (Microsoft@Microsoft.com) (gcc version 4.7 (GCC) ) #1 SMP PREEMPT Wed Dec 31 14:42:53 PST 2014

und unter dem Pi:

cat /proc/version
Linux version 4.1.19-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #858 SMP Tue Mar 15 15:56:00 GMT 2016

und unter der Vu+:

cat /proc/version
Linux version 3.13.5 (plnick@build-plnick) (gcc version 4.9.2 (GCC) ) #1 SMP Tue
Jan 19 02:38:57 CET 2016

OK die Vu+ verwendet Kernel 3.13.5, die Ubuntuvariante 3.4.0 jedoch, hier muss ich sagen ist es keine normale Ubuntuvariante sondern die vom Windows Subsystem for Linux (WSL) die seit Windows 10 v1607 verfügbar ist Smiley. Wobei man hier nicht von Kernel sprechen darf, da es bei WSL keinen Linux-Kernel gibt sondern die Syscalls auf den NT-Kernel, also Windows-Kernel abgebildet werden.

Ein richtiges Ubuntu würde sich so melden:

Linux version 4.2.0—27—generic (buildd@lcy01—23) (gcc version
4.8.2 (Ubuntu 4.8.2—19ubuntu1) ) #32~14.04.1—Ubuntu SMP
Fri Jan 22 15:32:26 UTC 16

Neben diesen Informationen wäre es ganz gut zu wissen, auf welcher Plattform bzw Architektur man sich befindet, dazu kann man uname verwenden:

uname -a

Linux vuzero 3.13.5 #1 SMP Tue Jan 19 02:38:57 CET 2016 mips GNU/Linux

bzw auf Ubuntu:

uname -a

Linux DESKTOP-FJE246N 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux

Der Pi:

uname -a

Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux

Bei der Vu+ haben wir es also mit einem Mips-System zu tun, beim Pi mit ARM und bei der Ubuntugeschichte mit einem üblichen Intel x64-System.

Um die wesentlichen Informationen einfacher lesen zu können, kann man auch diese Variante benutzen:

uname -m

Damit bekommt man direkt armv7l, mips, 32 oder 64 zurück.

Jede Distribution speichert im /etc-Verzeichnis Infos über sich ab. Man muss in der Regel nur nach Dateien mit der Endung release, info oder version suchen, man kann dies praktischerweise in einen Einzeiler packen:

ls /etc/*version /etc/*release /etc/*info

Wie diese Seite http://www.sysadminslife.com/linux/quicktipp-installierte-linux-distribution-anzeigen-und-version-herausfinden/ aufzeigt, verwenden die meisten Distributionen die Endung version oder release.

Bei unserem Dreiklang sehen die Ausgaben wie folgt aus, zunächst der Raspberry:

ls /etc/*version /etc/*release /etc/*info

/etc/debian_version  /etc/os-release

/etc/terminfo:

README

cat /etc/debian_version

8.0

cat /etc/os-release

PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"

NAME="Raspbian GNU/Linux"

VERSION_ID="8"

VERSION="8 (jessie)"

ID=raspbian

ID_LIKE=debian

HOME_URL="http://www.raspbian.org/"

SUPPORT_URL="http://www.raspbian.org/RaspbianForums"

BUG_REPORT_URL=http://www.raspbian.org/RaspbianBugs

Nun die WSL-Ubuntu-Variante:

ls /etc/*version /etc/*release /etc/*info

/etc/debian_version  /etc/ec2_version  /etc/lsb-release  /etc/os-release

/etc/terminfo:

README

cat /etc/debian_version

jessie/sid

cat /etc/ec2_version

Ubuntu 14.04 LTS (Trusty Tahr)

cat /etc/lsb-release

DISTRIB_ID=Ubuntu

DISTRIB_RELEASE=14.04

DISTRIB_CODENAME=trusty

DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

cat /etc/os-release

NAME="Ubuntu"

VERSION="14.04.5 LTS, Trusty Tahr"

ID=ubuntu

ID_LIKE=debian

PRETTY_NAME="Ubuntu 14.04.5 LTS"

VERSION_ID="14.04"

HOME_URL="http://www.ubuntu.com/"

SUPPORT_URL="http://help.ubuntu.com/"

BUG_REPORT_URL=http://bugs.launchpad.net/ubuntu/

Nun die Vu+:

ls /etc/*version /etc/*release /etc/*info

ls: /etc/*release: No such file or directory

/etc/image-version    /etc/version          /etc/vtiversion.info

/etc/terminfo:

a  d  l  r  s  v  x

cat /etc/image-version

version=0903201605170204

creator=VTi <info@vuplus-support.org>

url=http://www.vuplus-support.org/

cat /etc/version

201605170159

cat /etc/vtiversion.info

VTi-Team Image Release v.9.0.3

Über diese Informationen erhält man also oftmals auch URLs um weitere Informationen zu erhalten.

Beim Raspberry mit seinem Raspbian weiß man nun also, dass man es mit einem Debian 8 (Jessie) zu tun hat, auch Ubuntu basiert auf Debian. Leider sind solche Infos bei der Vu+ nicht zu erhalten. Hier erhält man nur die Information, dass VTi in Version 9.0.3 vom 9.3.2016 installiert ist.

Neben der Software spielt natürlich auch die Hardware eine Rolle. Welchen Prozessor hat man konkret vor sich. Hier hilft /proc/cpuinfo

Die Vu+:

cat /proc/cpuinfo

system type             : BCM7362A0 STB platform

machine                 : Unknown

processor               : 0

cpu model               : Broadcom BMIPS4380 V6.5  FPU V0.1

BogoMIPS                : 749.56

cpu MHz                 : 751.518

wait instruction        : yes

microsecond timers      : yes

tlb_entries             : 32

extra interrupt vector  : yes

hardware watchpoint     : no

isa                     : mips1 mips2 mips32r1

ASEs implemented        : mips16

shadow register sets    : 1

kscratch registers      : 0

core                    : 0

VCED exceptions         : not available

VCEI exceptions         : not available

processor               : 1

cpu model               : Broadcom BMIPS4380 V6.5  FPU V0.1

BogoMIPS                : 753.66

cpu MHz                 : 751.518

wait instruction        : yes

microsecond timers      : yes

tlb_entries             : 32

extra interrupt vector  : yes

hardware watchpoint     : no

isa                     : mips1 mips2 mips32r1

ASEs implemented        : mips16

shadow register sets    : 1

kscratch registers      : 0

core                    : 0

VCED exceptions         : not available

VCEI exceptions         : not available

beim Pi:

cat /proc/cpuinfo

processor       : 0

model name      : ARMv7 Processor rev 5 (v7l)

BogoMIPS        : 38.40

Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

CPU implementer : 0x41

CPU architecture: 7

CPU variant     : 0x0

CPU part        : 0xc07

CPU revision    : 5

processor       : 1

model name      : ARMv7 Processor rev 5 (v7l)

BogoMIPS        : 38.40

Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

CPU implementer : 0x41

CPU architecture: 7

CPU variant     : 0x0

CPU part        : 0xc07

CPU revision    : 5

processor       : 2

model name      : ARMv7 Processor rev 5 (v7l)

BogoMIPS        : 38.40

Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

CPU implementer : 0x41

CPU architecture: 7

CPU variant     : 0x0

CPU part        : 0xc07

CPU revision    : 5

processor       : 3

model name      : ARMv7 Processor rev 5 (v7l)

BogoMIPS        : 38.40

Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm

CPU implementer : 0x41

CPU architecture: 7

CPU variant     : 0x0

CPU part        : 0xc07

CPU revision    : 5

Hardware        : BCM2709

Revision        : a01041

Serial          : 00AAAAAAAAAAAAAA

und noch Ubuntu:

cat /proc/cpuinfo

processor       : 0

vendor_id       : GenuineIntel

cpu family      : 6

model           : 78

model name      : Intel(R) Core(TM) i5-6260U CPU @ 1.80GHz

stepping        : 3

microcode       : 0xffffffff

cpu MHz         : 1800.000

cache size      : 256 KB

physical id     : 0

siblings        : 2

core id         : 0

cpu cores       : 2

apicid          : 0

initial apicid  : 0

fpu             : yes

fpu_exception   : yes

cpuid level     : 6

wp              : yes

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor

bogomips        : 3600.00

clflush size    : 64

cache_alignment : 64

address sizes   : 36 bits physical, 48 bits virtual

power management:

processor       : 1

vendor_id       : GenuineIntel

cpu family      : 6

model           : 78

model name      : Intel(R) Core(TM) i5-6260U CPU @ 1.80GHz

stepping        : 3

microcode       : 0xffffffff

cpu MHz         : 1800.000

cache size      : 256 KB

physical id     : 0

siblings        : 2

core id         : 1

cpu cores       : 2

apicid          : 0

initial apicid  : 0

fpu             : yes

fpu_exception   : yes

cpuid level     : 6

wp              : yes

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave osxsave avx f16c rdrand hypervisor

bogomips        : 3600.00

clflush size    : 64

cache_alignment : 64

address sizes   : 36 bits physical, 48 bits virtual

power management:

Bei so vielen Infos macht es evtl. noch Sinn nach dem Speicher zu fragen, den Arbeitsspeicher bekommt man mittels free –h und den Plattenplatz mittels df –h.

Bei ARM kommt in Zukunft sicher noch die Frage nach 32-Bit oder 64-Bit Prozessor. Der Raspberry z. B. ist noch 32-Bit ein armv8 wäre 64-Bit. http://unix.stackexchange.com/questions/136407/is-my-linux-arm-32-or-64-bit.

Weitere Infos zum Thema kann man hier finden: http://unix.stackexchange.com/questions/6345/how-can-i-get-distribution-name-and-version-number-in-a-simple-shell-script.

Tschüss Teamviewer– Alternative – Willkommen Remotehilfe

4 August 2016

Teamviewer war mal eine echte Hilfe aber wie bei allem wird es irgendwann zur Plage. Hier hab ich mich schon mal über den Teamviewer ausgelassen: https://newyear2006.wordpress.com/2014/07/05/teamviewer-hat-seinen-zenit-berschritten/. Er hat seine Vorteile aber wenn es darum geht jemand unbedarftem schnell zu helfen, dann stößt man immer öfter an seine Grenzen.

Microsoft hatte schon bei Windows XP mit der Remoteunterstützung versucht das Leben der Supporter einfacher zu machen. Bei Windows 7 mit Einführung von Easy Connect war das Prinzip gut aber Microsoft war damals noch nicht in der Cloud angekommen. Deshalb gab es zu viele Situationen wo die Remoteunterstützung einfach nicht brauchbar war. Mit dem Windows 10 Anniversary Update, also Version v1607 hat Microsoft nun einen neuen Versuch gestartet die Sache anzugehen.

Und oh Wunder, es scheint richtig gut geworden zu sein! Muss auch mal MS loben, sonst wird ja nur über sie hergezogen Smiley.

Wer Cortana um Remotehilfe befragt dem zeigt sich die Remotehilfe App auch Quick Assist genannt. Dabei zeigt sich ein einfaches Fenster, wo man Jemand Hilfe anbieten oder Hilfe in Anspruch nehmen kann. Voll simpel.

Der Hilfesuchende klickt einfach auf “Unterstützung anfordern” und wird dann aufgefordert einen sechstelligen Code einzugeben. Dieser Code wird vom Gegenüber demjenigen der die Hilfe anbietet erzeugt und angezeigt. Dieser ruft auch Remotehilfe auf und wählt dann “Unterstützung gewähren” aus. Danach öffnet sich ein Fenster, wo man sich mit seinem Microsoft Konto anmelden muss, dies erscheint nicht, wenn man sein lokales Konto mit dem Microsoft Konto verbunden hat. Danach wird der sechstellige Sicherheitscode erzeugt und angezeigt. Diesen teilt man nun dem Hilfesuchenden mit und schon kann es losgehen.

Bei der Vorgehensweise zeigt sich eine Umkehrung des Teamviewerverbindungsaufbauprinzips. Nicht der Hilfesuchende hat die ID und das Kennwort sondern der Gewährende. Durch die Azurecloud und modernste ICE-Techniken um NATs zu durchbohren, klappt dann die Verbindung ohne Probleme.

Eine prima Alternative also zum Teamviewer! Aber es geht noch besser.

Ruft man die Internetseite https://remoteassistance.support.services.microsoft.com auf, dann bekommt man auch hier die Auswahl Hilfe anzufordern oder zu gewähren. Wie bei der Desktop-App kann eine Sitzung aufgebaut werden. Leider bricht die Verbindung zum jetzigen Zeitpunkt immer ab, wenn es darum geht den Bildschirm zu übertragen. Schade, schade, das wäre eine echtes Highlight gewesen, wenn dies auch noch funktioniert hätte. Aber warten wir mal ab…

Was ist neu bei Windows 10 v1607?

3 August 2016

Das Anniversary Update von Windows 10 ist nun offiziell verfügbar, stellt sich wie immer die Frage, was hat sich geändert?

Hier der Link zu Technet: https://technet.microsoft.com/en-us/itpro/windows/whats-new/whats-new-windows-10-version-1607

und MSDN: https://msdn.microsoft.com/en-us/windows/uwp/whats-new/windows-10-version-1607

Weitere Infos kann man hier finden: https://newyear2006.wordpress.com/2016/01/28/neueste-beschreibungen-fr-windows-10-bzw-windows-10-mobile/. Dabei auch die Kommentare beachten.

Feststellen ob WinPE im UEFI- oder BIOS-Modus gestartet wurde

2 August 2016

Für die Konfiguration von Rechnern ist es wichtig, dass man sich im richtigen Firmwaremodus befindet. Früher war es immer das altgediente BIOS aber seit ein paar Jahren gibt es eben auch UEFI. Um nun unter dem Windows Preinstallation Environment (WinPE) feststellen zu können, in welchem Modus man sich befindet, gibt es einen Registrierungskey den man abfragen kann:

reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType

Man bekommt 0x1 für BIOS und 0x2 für UEFI zurück.

Wenn der Wert nicht ermittelbar ist, sollte man

WPEUtil.EXE UpdateBootInfo

vorab ausführen! Hinweis: Anders als in der Quelle angegeben wird beim Parameter UpdateBootInfo kein Schrägstrich verwendet!

Quelle: https://msdn.microsoft.com/de-de/library/dn293283.aspx.

Hier noch wie man die PE-Version selber abfragen kann: https://newyear2006.wordpress.com/2011/05/17/winpe-version-feststellen/.

Binärtyp einer EXE-Datei unter Windows ermitteln, ob 32- oder 64-Bit–man spricht auch von Bitness

27 Juli 2016

Möchte man unter Windows bei einer ausführbaren Datei wissen, ob diese eine 32-Bit oder 64-Bit Version ist, dann kennt die Win32-API die Funktion GetBinaryType. Mittels Powershell kann man diese Funktion wie folgt nutzen:

$MethodDefinition = @‘

// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364819(v=vs.85).aspx
[DllImport("kernel32.dll")]
public static extern bool GetBinaryType(string lpApplicationName, out uint lpBinaryType);

‚@

$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name ‚Kernel32‘ -Namespace ‚Win32‘ -PassThru

# Funktioniert aber nur, wenn man sich in einem 64-Bit Prozess befindet, also: [System.IntPtr]::Size -eq 8
$type=0
$Kernel32::GetBinaryType("c:\windows\system32\cmd.exe", [ref] $type)  # unter 64-Bit sollte es 6 sein
$type
$Kernel32::GetBinaryType("c:\windows\syswow64\cmd.exe", [ref] $type)  # unter 64-Bit sollte es 0 sein
$type

# mögliche Werte für $type:
# SCS_32BIT_BINARY = 0, // A 32-bit Windows-based application
# SCS_64BIT_BINARY = 6, // A 64-bit Windows-based application.
# SCS_DOS_BINARY = 1,   // An MS-DOS – based application
# SCS_OS216_BINARY = 5, // A 16-bit OS/2-based application
# SCS_PIF_BINARY = 3,   // A PIF file that executes an MS-DOS – based application
# SCS_POSIX_BINARY = 4, // A POSIX – based application
# SCS_WOW_BINARY = 2    // A 16-bit Windows-based application

Dabei ist zu beachten, wenn man den Test macht, dass IntPtr 8 liefern sollte, sonst befindet man sich in einem simulierten WOW64-32Bit-Prozess und bekommt verwunderliche Ergebnisse zurück.

HP Netzwerkdrucker per Remote und Reboot.TXT neu starten – nix klappt aber SNMP bringt die Lösung

10 Juli 2016

Beim Rumspielen mit verschiedenen HP-Druckereigenschaften kommen einem manchmal Zweifel, ob alles noch korrekt reagiert. Aus diesem Grund sollte man den betreffenden Drucker von Zeit zu Zeit neu starten um nach einem Neustart die betreffenden Reaktionen zu testen. Im konkreten Fall handelt es sich um einen “HP LaserJet MFP M426fdw”, also ein recht aktuelles Modell.

Blöd nur, dass Varianten mittels einer reboot.txt, wie hier https://community.spiceworks.com/how_to/122155-how-to-reboot-an-hp-printer-remotely oder hier http://dxpetti.com/blog/?p=706 beschrieben nicht funktionieren. Übrigens, FTP-Druck wurde explizit aktiviert, sonst kann man den Drucker per FTP nicht anfahren. Die kompliziertere Variante für Reboot.TXT sieht übrigens so aus:

%-12345X@PJL COMMENT
@PJL DMINFO ASCIIHEX="040006020501010301040105"
%-12345X

Allerdings muss man wissen, dass vor % noch ein ein ASCII-Zeichen mit Code 27 steht. Man kann die passende Datei mittels Powershell ganz einfach so erzeugen:

# {ESC}%-12345X
$k=[System.Text.Encoding]::ASCII.GetString(@(27,37,45,49,50, 51, 52, 53, 88))
$lf=[System.Text.Encoding]::ASCII.GetString(@(13, 10))
$i=’@PJL COMMENT‘
$c=’@PJL DMINFO ASCIIHEX="040006020501010301040105"‘
#$c=’@PJL DMCMD ASCIIHEX="040006020501010301040105"‘

$k + $i + $lf + $c + $lf + $k | set-content -Encoding Ascii -Path "$($env:USERPROFILE)\Reboot.txt"

Aber auch mit der korrekten Escape-Sequenz am Anfang klappte es nicht!

Auch hier wird wieder die ganz einfache reboot.txt Variante beschrieben: https://www.experts-exchange.com/questions/24432791/Rebooting-HP-Jetdirect-remotley.html. Klappt natürlich nicht, aber es war etwas von einem Reboot mittels SNMP beschrieben. Hier soll set OID .1.3.6.1.2.1.43.5.1.1.3.1 with Integer "4" gesetzt werden.

Aha, SNMP das uralte Protokoll. Selbst HP geht darauf aber noch ein und verwendet es für bestimmte Aufgaben, hier ein aktuelles Dokument aus April 2016: http://h20564.www2.hp.com/hpsc/doc/public/display?docId=c01840676.

Tatsächlich findet man bei der Suche nach der OID und Powershell Scripte, wie hier: http://forum.support.xerox.com/t5/Copying-Faxing-Scanning/Schedule-printer-reboot/m-p/176844#M5393. Das Script ist zwar nicht 1:1 übertragbar aber damit wird der Weg klar.

Selbst in Windows 10 gibt es eine OLE SNMP-Klasse https://msdn.microsoft.com/en-us/library/windows/hardware/ff554433(v=vs.85).aspx, welche man mittels Powershell ganz einfach für diesen Zweck einsetzen kann:

$PrinterIP = "192.168.1.87" # hier die tatsächliche IP des Druckers setzen
$SNMP = New-Object -ComObject olePrn.OleSNMP
$SNMP.Open($PrinterIP, "public")
$SNMP.Set(".1.3.6.1.2.1.43.5.1.1.3.1",4)
$SNMP.Close()

Sofort nach absetzen des Set-Befehls startet der Drucker neu! Und was dabei noch interessant ist, es klappt auch mit anderen Druckerfabrikaten.

Vorsicht mit Get-NetFirewallRule bzw. WMI MSFT_NetFirewallRule-Klasse bei Abfrage der Enabled-Eigenschaft – gilt allgemein bei $True und $False in Powershell

10 Juli 2016

Ein Script welches Windows Firewall Regel-Eigenschaften abfragte funktionierte nicht wie erwartet. Es wurde immer die Enabled Eigenschaft abgefragt aber es kam nicht das erwartete Ergebnis, wurde die Abfrage aber negiert, kam das erwartete Ergebnis heraus! Am Ende stellte es sich heraus, dass die Enabled-Eigenschaften kein klassisches Bool sondern einen String zurückgibt, hier die Story:

Fragen wir zunächst die aktuelle Anzahl von Regeln ab, hier bei einem aktuellen Windows 10:

$r=Get-NetFirewallRule
$r.length
413

Es gibt also 413 Regeln. Nun sollen alle Regeln ermitteln werden, die aktiviert sind:

($r | where enabled -eq $true).length
184

Jetzt sollen alle Regeln ermittelt werden, die nicht aktiviert sind:

($r | where enabled -eq $false).length
0

Die 0 ist jetzt nicht das erwartete Ergebnis, wenn man davon ausgeht, dass es 413 Regeln gibt, davon sind 184 aktiv, dann sollten mehr als 0 inaktiv sein.

Wo liegt das Problem? Das Problem ist, dass bei $True oder $False in Powershell immer True oder False am Bildschirm ausgegeben wird. Man interpretiert einen solchen Wert schnell als Boolean. Aber in diesem Fall hat man es nicht mit einem Boolean zu tun:

$r[0].enabled.pstypenames
Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Enabled
System.Enum
System.ValueType
System.Object

Es ist also ein Aufzählungstyp!

($r | where enabled -eq "True").length
184
($r | where enabled -eq "False").length
229

So macht die Sache mehr Sinn!

Oder man macht die Abfrage über den passenden Typ:

($r| where enabled -eq ([Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Enabled]:
:True)).length
184
($r| where enabled -eq ([Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.Enabled]:
:False)).length
229

Übrigens: $true –eq "True" ergibt immer True, auch wenn man $true –eq "irgendwas" setzt! Und $False –eq "False" ergibt immer False, egal mit was verglichen wird, außer $false!

Deutsche Tastaturbelegung bei 16-Bit Programmen unter Windows 10

7 Juni 2016

Noch ein kleiner Nachschlag zum vorherigen Blogeintrag https://newyear2006.wordpress.com/2016/06/06/16-bit-komponenten-unter-windows-10-und-fehlermeldung-ntvdm-angeschlossenes-gert-funktioniert-nicht/. Wer so 16-Bit Programme verwendet, der wird sich wundern wo die Umlaute geblieben sind. Man kann das Problem ganz einfach nachstellen:

Macht man eine Eingabeaufforderung auf, dann handelt es sich um eine 32-Bit Eingabeaufforderung, hier sind die Umlaute noch verfügbar. Gibt man nun COMMAND ein, wird die eigentliche 16-Bit Umgebung geladen, sind auf einmal die Umlaute weg. Selbiges passiert auch beim direkten Laden von 16-Bit Programmen über Verknüpfung oder Namenseingabe.

Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\Benutzer>öäß
Der Befehl "öäß" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

C:\Users\Benutzer>command
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.

C:\USERS\BENUTZER>;‘-

Dieser Artikel ist zwar alt aber hat auch bei Windows 10 immer noch Gültigkeit https://newyear2006.wordpress.com/2006/09/18/deutsche-tastaturbelegung-fur-16bit-dos-programme-unter-vista-rc1/. D. h. man aktiviert durch einfügen von

LH KB16 GR,,%SystemRoot%\system32\keyboard.sys

in der C:\Windows\System32\AUTOEXEC.NT Datei die deutsche Tastaturunterstützung. Nun muss das Programm oder die Eingabeaufforderung nur nochmal neu gestartet werden, dann ist alles gut.

Noch ein Hinweis: Nicht wundern, wenn man diesen Schritt immer wieder nach jedem größeren Windowsupgrade machen muss, da das Gesamtsystem durch z. B. das kommende Anniversary Update immer wieder zurückgesetzt wird!

16-Bit Komponenten unter Windows 10 und Fehlermeldung NTVDM angeschlossenes Gerät funktioniert nicht

6 Juni 2016

Da nun immer mehr Rechner auf Windows 10 umgestellt werden, wo davor kein Bedarf war, kommt es auch zu dem einen oder anderen Aha-Erlebnis. Eigentlich klappt der Umstieg ganz gut. Wer aber auf eine 32-Bit Windows 10 Version umgestiegen ist und noch 16-Bit DOS- oder Windowsprogramme benutzt, der könnte ganz schnell ins Fluchen geraten.

Hier bin ich schon früher auf das Thema NTVDM und 16-Bit-Programme unter Windows 8 eingegangen: https://newyear2006.wordpress.com/2013/09/15/16-bit-programme-unter-windows-8-es-muss-zuerst-die-16-bit-anwendungsuntersttzung-aktiviert-werden/, hier für Windows 8.1: https://newyear2006.wordpress.com/2013/09/15/nochmal-zum-thema-16-bit-programme-unter-windows-8-1-32-bit-und-wie-verhlt-es-sich-mit-fondue-exe-und-den-legacykomponenten/.

Dieser Dialog ist auch unter Windows 10 verfügbar die Installation der Legacyfeatures funktioniert genauso wie bei 8 und 8.1 beschrieben.

Allerdings laufen unter Windows 10 die meisten 16-Bit-Programme immer noch nicht!! Warum? Weil Microsoft eine zusätzliche Hürde für 16-Bit-Programme eingebaut hat. Es handelt sich dabei um die neue Konsole mit den erweiterten Copy&Paste-Eigenschaften über die Tastatur. Diese sorgt dafür, dass wenn ein altes 16-Bit-Programm mit installierter Legacy-Komponente aufgerufen wird diese Fehlermeldung erscheint:

image

Hier nochmal die reine Textform für die Suchmaschinen:

—————————
16 bit MS-DOS Subsystem
—————————
Eingabeaufforderung – Anwendung
NTVDM has encountered a System Error
Ein an das System angeschlossenes Gerät funktioniert nicht.

Choose ‚Close‘ to terminate the application.
—————————
Schließen   Ignorieren  
—————————

Was tun? Die Ereignisanzeige protokolliert auch nur brav mit, dass ein Problem auftrat:

PS C:\> Get-EventLog -LogName System -Source "Application Popup" -InstanceId 26 | select -First 1 | fl *

EventID            : 26
MachineName        : MeinRechnerName
Data               : {}
Index              : 945
Category           : (0)
CategoryNumber     : 0
EntryType          : Information
Message            : CriticalAppShutdownCleanupTimeout
Source             : Application Popup
ReplacementStrings : {16 bit MS-DOS Subsystem, Eingabeaufforderung – Anwendung                     NTVDM has encountered a System Error                      Ein an das System angeschlossenes Gerät funktioniert nicht.                       Choose ‚Close‘ to terminate the application.}
InstanceId         : 26
TimeGenerated      : 06.06.2016 15:15:47
TimeWritten        : 06.06.2016 15:15:47
UserName           : NT-AUTORITÄT\SYSTEM
Site               :
Container          :

Wenn man googlet, dann könnte man über diesen Thread http://answers.microsoft.com/en-us/insider/forum/insider_wintp-insider_update/16-bits-applications-not-working-at-all/a776a720-ff62-4848-96b1-81b4371cff2c?page=3 stolpern und hier hat MarcelloCapozzi den richtigen Vorschlag:

Einfach die “Legacy Console” aktivieren!

Merke: Nicht nur die Legacy Komponente muss installiert werden, sondern ab Windows 10 auch noch bei den Einstellungen die Legacy Console!

image

Dazu muss man also bei den Eingabeaufforderung oder Programmverknüpfungseigenschaften auf das Register Optionen gehen. Der Hinweis “erfordert Neustart” bezieht sich nicht auf den Rechner sondern auf das jeweilige Programm, bzw. die Eingabeaufforderung.

Wer die Sache skripten muss, der kann sich um HKEY_CURRENT_USER\Console bemühen und dort speziell den Eintrag ForceV2, dieser steuert das Verhalten ob Legacy aktiviert ist oder nicht. Leider fehlt mir gerade die Zeit dies weiter auszuführen. Hier gibt es weitere Infos: https://technet.microsoft.com/en-us/library/mt427362.aspx.


Folgen

Erhalte jeden neuen Beitrag in deinen Posteingang.