Mittwoch, August 07, 2013

Eieruhr mit Powershell

Es gibt offensichtlich mehrere Fallstricke, um einen Timer sekundengenau mit Powershell zu starten.
Hier die Vorgehensweise um den Timer für ein 6 Minutenei unter Windows 7 zu erstellen.

#130807 Eieruhr von https://ibjs.net #egg-timer
$schtasksdirname ="$env:temp/schtasks"
if ((gci $schtasksdirname 2>$null) -eq $null){mkdir $schtasksdirname}
#Info: Schtask /create /? Beschreibt das Format von /ST mit HH:mm
$st="{0:HH:mm}" -f [datetime]::Now.AddMinutes(6)
$stb="{0:yyyy-MM-ddTHH:mm:ss}" -f [datetime]::Now.AddMinutes(6)
Schtasks /create /F /tn Eieruhr /sc einmal /st $st /tr "Powershell.exe '1..3|%{[console]::beep(440,800);start-sleep -seconds 1.2}'"
schtasks /query /xml /tn Eieruhr > $schtasksdirname/Eieruhr.xml
$eieruhrxmlfile=gci $schtasksdirname/Eieruhr.xml
$eieruhrxml=Get-Content $eieruhrxmlfile
$eieruhrxml -replace "StartBoundary\>.+[<]{1}","StartBoundary>$stb<" >$eieruhrxmlfile
Schtasks /create /F /tn Eieruhr /xml $eieruhrxmlfile
#schtasks /delete /tn Eieruhr


Problem:
der Windows Taskmanager schtasks kennt als Starttime Format nur HH:mm. Wenn es dumm kommt, dann führen die fehlenden Sekunden zu einem zu weichen Ei.

Lösung:
  1. Scheduled  Tasks wird in Powershell angelegt, Name tn=Eieruhr, Starttime st=HH:mm,..., Aktion /tr=Powershell mit 3x Console Beep von Kammerton A
  2. Der angelegte Task wird mit /query /xml in das zuvor angelegte Verzeichnis $env:temp/schtasks gespeichert
  3. Dann wird in der XML Datei  die im Tag StartBoundary stehende Zeit durch $stb im sekunden genauen Format per -replace ersetzt
  4. Mit schtasks /create /F /tn Eieruhr /xml .... wird der Task Eieruhr überschrieben
  5. Nach 6 Minuten tutet es, dann die Eier herausnehmen.

Advertisement Blocker - InternetExplorer

Was tun?
Ich habe folgendes probiert:
1. Installation AdblockIE, nach nun 30 Tagen kam die anfangs nicht bemerkte Aufforderung zur Zahlung eines Betrages. -> Nicht akzeptabel
2. Installation eines anderen Browsers mit angeblich kostenlosen Werbeblockern. -> ok, aber nach Möglichkeit soll mein System minimalistisch bleiben, d.h. möglichst keine weitere Software zum OS
3. Installation der Open Source SW von AdblockPlus.org. ->ok, für IE ist Entwicklung. per Default gibt es ABP für Chrome, Opera, Firefox und Android. Die Frage ist, was steckt zusätzlich zu den IE Bordmitteln dahinter?
4. IE Bordmittel: //IE10/Extras/Internetoptionen/Programme/Add-Ons verwalten/Trackingschutz/Liste für den Tracking-Schutz online abrufen: z.B. von Adblockplus die Tracking Protection Lists easylist-msie und easylist-msie-Germany auswählen

Dienstag, August 06, 2013

VBS wscript, beep, Powershell

Problem
für ein umfangreiches vbs script soll eine akustische Meldung ergänzt werden, ohne große Umschreibung und Betriebssystem fremde Tools. Mit VBA könnte man mit

LPrivate Declare Function Beep Lib _
    "kernel32" (ByVal dwFreq As Long, _
    ByVal dwDuration As Long) As Long

auf kernel32.exe zugreifen und beep(Frequenz,Dauer) nutzen

Das geht aber nicht mit vbs.

Lösung
Wir nehmen Powershell hinzu und nutzen gleich noch das .net [console] Objekt.
Die folgenden Zeilen ergänzen das .vbs script und lassen es dreimal tuten.

set wshell = CreateObject("Wscript.shell")
wshell.run("c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe ""1..3|%{[console]::beep(440,1000);start-sleep(1)}""")

Mittwoch, Juli 31, 2013

Wundermütze mit wordpad, write und Windows7

Beim Start von Wordpad aus Powershell heraus kam es zu unerwarteten Problemen beim Aufruf.
Lösung:
(cmd /c write)

Problembeschreibung:
//windows Start/Suche: wordpad und
//windows Start/Suche: write

liefern beide:
C:\Program Files\Windows NT\Accessories\wordpad.exe

von der command shell aus kann aber nur write starten
Die Powershell startet mit write, write-object

Erst nach Hinzufügen des Pfades kennt Powershell auch Wordpad:

$env:path+=';C:\Program Files\Windows NT\Accessories'
wordpad

Offen ist, warum cmd write kennt und wordpad startet.

Dazu fragen wir mal:
((cmd /c echo %path%).split(';')|%{(gci -path $_ *.* 2>$null)})|?{$_.name -match '(\bwrite\..+)|(\bwordpad\..+)'}|select directory, name,length|ft -auto

Also gibt es unter c:\windows und c:\windows\system32 jeweils eine write.exe mit 10240 bytes. Das nach dem Start geöffnete Programm nennt sich wordpad. Auch get-process findet nur wordpad und nicht write.

Im oben genannten  Zubehör Pfad findet man dann auch wordpad.exe:
gci -path 'C:\Program Files\Windows NT\Accessories' *.*

Es ist größer als 4MB.

Die letzte offene Frage ist somit, wie wird aus write wordpad, und woher wusste die Suche, dass bei der Suche nach Wordpad die Datei Write zu finden ist, welche letztlich wordpad aufruft??. Vermutlich ist write.exe nur eine Weiterleitung auf wordpad.exe.

Am Einfachsten ist somit die oben genannte Lösung. (cmd /c write)

Dienstag, Juli 30, 2013

Scrollbars und Code bei blogger

Darstellung von Code in Div containern und Verwendung von Scrollbars.

<div style="border: 1px solid brown; background-color:#eee;height: 144px; overflow: scroll; width: 435px;padding:3px;">
<div style="width:990px;">
<pre><code>Code...BlaBla........
</code>
</pre>
</div>
</div>

Die die Darstellung von Code auf der Blogger Seite zeigt obiger Code.
Das erste Div bestimmt,  wie groß die Code Box wird und wie sie aussieht.
Das zweite Div bestimmt, ab welcher Breite ein Text zum Umbruch führt. Auch kann man an dieser Stelle erst mit diesem zweiten Div das Overflow Attribut dazu animieren, einen horizontalen Schiebebalken zu aktivieren.
Das Pre Tag sorgt dafür, dass die Code Zeilenumbrüche und Leerzeichen wie vorgegeben dargestellt werden.
Das Code Tag markiert Anfang und Ende des Code und formatiert standardmäßig in einer monospaced Schriftart.
Den Code lässt man am Besten von einem Wysiwyg Editor wie Expression Web in HTML umwandeln, damit etwaige Steuerzeichen oder Tags als Text und Entities eingesetzt werden.

Play Sound mit Powershell

Die folgenden Powershell Zeilen veranlassen Windows, eines der möglichen Logon Sounds abzuspielen.
Zuerst Powershell im Single Thread Apartment Modus starten: powershell -sta
Dann copy & paste
. . Getestet auf Windows7

#--------kopiere von hier-----------------
Cls;#Erstmal machen wir reinen Tisch
@"
https://www.ibjs.net 130730 - Zufällige Wiedergabe von Mediendateien in Powershell, FileSystem, Mediaplayer
Anregungen vom Guru http://powershell.com/cs/blogs/tobias/archive/2011/01/07/organizing-videos-and-music.aspx
sicherheitshalber die Powershell im STA Mode starten: powershell -sta
sonst sind Thread Fehler zu erwarten:
The calling thread cannot access this object because a different thread owns it
Der aufrufende Thread kann nicht auf dieses Objekt zugreifen,
da sich das Objekt im Besitz eines anderen Threads befindet.
"@
 If ($host.Runspace.ApartmentState -eq 'STA')
{
#Windows verwaltet FileSystemInfo Objekte, die man z.B. mit gci ermittelt
 $Suchwort="Logon"# Logon,Balloon, Default, Ding, Error, Notify, etc
 $files=(gci -path $env:windir/media -recurse "*$Suchwort*" -include *.wav,*.mp3)
 $file=$files|get-random -count 1
#Mit dem shell-object hat man Zugriff auf die zusätzlichen Dateieigenschaften für ein FileSystemObjekt
 $shell=New-Object -COMObject Shell.Application
#Man benötigt die shellfolder, welche Träger der Eigenschaften sind
 $shellfolder=$shell.namespace($file.DirectoryName)
#Die Eigenschaften beziehen sich auf die items des shellfolders, den shellfile
 $shellfile=$shellfolder.parsename($file.Name)
#msdn nennt 289 Eigenschaften: http://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx
#die man mit getdetailsof anzeigen kann
 0..288|?{ $shellfolder.GetDetailsOf($shellfile, $_) }| %{'{0,-4}{1,-24}{2}' -f $_,$shellfolder.GetDetailsOf($null, $_),  $shellfolder.GetDetailsOf($shellfile, $_)}
#für den Medienplayer ist vielleicht die 27, die Liedlänge interessant
 $Länge=([timespan]$shellfolder.GetDetailsOf($shellfile,27)).totalseconds
 if ($Länge -gt 5) {$Länge=5} #kleine Bremse
#nun kann man den Medienplayer zum Abspielen bemühen
 Add-Type -AssemblyName presentationCore
 $mediaPlayer = New-Object system.windows.media.mediaplayer
 $mediaPlayer.open([uri]"$($file.fullname)")
 $mediaPlayer.Play()
#Warte bis Lied aus
 Start-Sleep -Seconds ([int]($Länge))
 $mediaPlayer.Stop()
#Ende der Vorstellung
} 
Else  {
"Starte die Powershell im Single Thread Appartment Modus mit: powershell -sta"
}
#Ende -------- kopiere bis hier !!!

Mittwoch, Juli 24, 2013

ASCII Zeichen in Powershell

32..127|%{"{0,10}{1,10}{1,10:x}" -f [char]$_,$_}

Ich liebe Powershell!!!

Vielleicht finde ich nicht immer den kürzesten Weg, aber ein Weg findet sich meistens.

Montag, Juli 15, 2013

Mein WederNoch

Vor einem Jahr habe ich mir ein Smartphone Sony Xperia P gekauft. Eigentlich ist es ein ganz tolles Gerät, wenn man von den vielen Unzulänglichkeiten absieht.
Zur Verzweiflung bringt mich, dass regelmäßig eingehende Anrufe zwar zu hören und zu sehen sind, die Annahme des Anrufes durch die vorgeschriebene Wischbewegung aber unmöglich ist. Ein unmittelbar folgender Rückruf durch mich ist dann problemlos möglich.
Zur großen Verwunderung macht sich das Gerät selbständig, indem es ohne willentliche Aufforderung Anrufe tätigt. Wahrscheinlich nimmt es bei geöffneter Telefonapplikation die erstbeste Gelegenheit zur Anwahl eines zufällig auf dem Display stehenden Kontaktes wahr.
Das erste Update des Betriebssystem im Sommer letzten Jahres führte zu einer Änderung des WiFi Verhaltens. Ein Wechsel des Routers war nur nach Reset des Gerätes möglich. Erst nach weitern vier Monaten gab es dann eine in diesem Punkt korrigierte Version.
Meine Frau wird niemals ein solches Gerät haben wollen. Sobald sie das Gerät in der Hand hat, löst sie unbewusst Aktionen am Gerät aus. Es verschwindet die Fotoanzeige, es wird etwas gewählt, also absolut unfreundlich für leicht technik-distanzierte Anwender.
Als Fotoapparat gibt es sehr gute Bilder, aber nur bei guter Beleuchtung. In lichtschwachen Situationen ist ein richtiger Fotoapparat sicher besser.
Als Navigationsgerät im Auto hat es bei einer längeren Autobahnfahrt die ersten 400 km gut mitgehalten, hat dann im entscheidenden Moment nach Abfahrt von der Autobahn und Einfahrt in unbekanntes Stadtgebiet wegen Überhitzung aufgegeben.

Fazit, das Gerät ist ganz nett, aber weder ein richtiges Telefon, noch ein Fotoapparat oder Navigationsgerät. Es ist eben ein WederNoch.

Powershell - Driverquery

Im Netz findet sich ein schönes Beispiel für die Verwendung eines command-shell Befehls zur Treiberanzeige mit Powershell:
http://powershell.com/cs/blogs/tips/archive/2011/12/20/finding-driver-information.aspx

driverquery.exe /v /FO CSV | ConvertFrom-CSV #| Select-Object 'Display Name', 'Start Mode', 'Paged Pool(bytes)', Path

Dummerweise wurden bei der deutschen Übersetzung beide Felder "State" und "Status" mit "Status" übersetzt, was ConvertFrom-CSV als Fehler interpretiert

Hier des Rätsels Lösung, Korrektur des Headers:
 
driverquery -v -fo csv|convertfrom-csv -header ((driverquery -v -fo csv)[0].replace('"','').replace('Status,Status','State,Status').split(','))|select Anzeigename,Startmodus,'Ausgelagerter Pool (Bytes)',Pfad|sort startmodus,anzeigename #|out-gridview

Kommentar:
1. ausführliche Ausgabe von driverquery im csv Format
2. Übernahme der CSV Daten in ein Powershellobjekt
3. dazu den Header aus der ersten Zeile der CSV Daten korrigieren
4. entferne zuerst die Gänsefüßchen
5. ersetze dann 'Status,Status' durch 'State,Status'
6. zeige dann die Felder aus dem Beispiel durch Angabe ihrer deutschen Feldnamen an
7. zusätzlich ist ein Sortieren nicht schlecht
8. Wer will, kann auch noch das GridView bemühen

Übrigens scheint es keine gute Idee zu sein, alles übersetzen zu wollen.

Sonntag, Juli 07, 2013

Auch das gibt's: XP Backup restore auf Windows7

Sinn und Zweck von Backups werden sogar von Microsoft in Frage gestellt. Ursprünglich war es nicht vorgesehen, mit XP erstellte backups zum restore unter Windows7 bereitzustellen. Nach einigem Murren der Anwender wurde zumindest für einen Teil der Anwender eine Lösung veröffentlicht. Unter dem Namen Windows6.1-KB974674-x64.msu findet sich bei Windows Update eine NTBackup-RestoreUtility genannte Software, die wenigstens den Anwendern der Ultimate oder Enterprise Version von Windows7 einen Blick in die Vergangenheit ermöglicht. Nur diesen Nutzern ermöglicht Microsoft die zur Installation erforderliche Umstellung auf die englische Sprachversion. Alle andern blitzen bei der Installation mit einer schnöden Fehlermeldung ab. Aber vielleicht gibt es noch irgendwo einen Patch für den Patch?

Freitag, Juli 05, 2013

Easytransfer von XP zu Windows 7

Easytransfer
Für die Mitnahme der Einstellungen des alten PC auf den Neuen bietet diese Freeware Unterstützung an.

Donnerstag, Juli 04, 2013

run as system

das geht mit psexec aus den sysinternals
psexec -i -s powershell.exe
zum Start von psexec braucht man aber die "normalen" Admin Rechte
Hauptanwendung von psexec ist aber die remote-Ausführung von Programmen auch die interaktive Ausführung einer remoteshell.

Outlook Suche in allen Postfächern

Outlook2013:
Erst wenn ein Postfachelement, wie der Posteingang eine beliebigen Postfachs, aktiviert wird, gibt Outlook die Aktion \\Outlook\Start\Suchen\E-Mail_filtern frei. Bei anderen aktiven Elementen bleibt die Aktion ausgegraut.

Tools - msconfig

Windows 7 bietet folgende Konfigurationsmöglichkeiten an:
\\start\ausführen\msconfig

Allgemein - Systemstart, Diagnosestart, Benutzerdef. Start
Start: Startoptionen, GUI, Protokollierung, Startinformationen
Dienste: Services
Systemstart: HKCU, HKLM Run, \\S1\...Startup,
Tools:
Info;Windows Versionmsinformation;C:\Windows\system32\winver.exe
UAC Einstellungen; Ändert Benutzerkontensteuerung;C:\Windows\System32\UserAccountControlSettings.exe
Wartungscenter;;C:\Windows\System32\UserAccountControlSettings.exe
Windows-Problembehandlung;;C:\Windows\System32\control.exe /name Microsoft.Troubleshooting
Computereinstellungen;Systemeinstellungen und -Komponenten;C:\Windows\System32\compmgmt.msc
Systeminformationen;Hard- und Softwareeinstellungen;C:\Windows\System32\msinfo32.exe
Ereignisanzeige;;C:\Windows\System32\eventvwr.exe
Programme;;C:\Windows\System32\appwiz.cpl
Systemeigenschaften;Basisinformationen wie Leistungsindex;C:\Windows\System32\control.exe system
Interneteigenschaften;;C:\Windows\System32\inetcpl.cpl
Internetprotokollkonfiguration;;C:\Windows\System32\cmd.exe /k %windir%\system32\ipconfig.exe
Leistungsüberwachung;;C:\Windows\System32\perfmon.exe
Ressourcenmonitor;;C:\Windows\System32\resmon.exe
Task-Manager;;C:\Windows\System32\taskmgr.exe
Eingabeaufforderung;;C:\Windows\System32\cmd.exe
Registrierungseditor;;C:\Windows\System32\regedt32.exe
Remoteunterstützung;Freund über Internet anfragen;C:\Windows\System32\msra.exe
Systemwiederherstellung;Früheren Zustand wiederherstellen;C:\Windows\System32\rstrui.exe






Donnerstag, Mai 30, 2013

PowerShell: ConvertTo-SecureString : Schlüssel ist im angegebenen Status nicht gültig

Problem:
Seit 5.April 2013 bingen meine Powershellscripts mit encrypted Securestrings Fehlermeldungen beginnend mit:
ConvertTo-SecureString : Schlüssel ist im angegebenen Status nicht gültig.

Lösung:
Neuerdings sind die Schlüssel etwas länger. Also neuen Securestring erzeugen und encrypted Text im Script ersetzen.

Hier einige Beispielzeilen:

Cls
$S=convertto-securestring "HalloWelt" -asplaintext -force
#Sicherer wäre den Klartext zu vermeiden:
#$S=read-host -assecurestring
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($S)
$Decoded=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($ptr);$Decoded
$Encrypted=convertfrom-securestring -securestring $s
$Encrypted.length;#Sollte neuerdings 324 sein
$A=(0..8)
0..8|%{$A[$_]=$Encrypted.substring(($_ * 36),36)}
"`$E=`$null";$A|%{"`$E+=""$_"""}
$E=$null;0..8|%{$E+=$A[$_]};$E
$S=convertto-securestring -string $E
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($S)
$Decoded=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($Ptr);$Decoded

Mittwoch, Mai 29, 2013

Die Bogenlampe oder This is us

Gerade lief im Radio ein Lied mit dem Text "This is us". Diese Konstruktion kommt in meinem Fremdwortschatz noch nicht vor. Sollte ich "Das sind wir" übersetzen wollen, dann hätte ich vielleicht "This we are" gesagt.
Interessant ist auch, dass meine Frau und ich nach einem Video namens "Trouble with the Curve" gesucht haben. Gefunden haben wir dann "Back in the Game". Die Frage ist, warum der Titel der englischen Version für die deutsche Variante geändert wurde?
Offensichtlich herrscht breite Vielfalt im Sprachgebrauch.

Freitag, Mai 24, 2013

Center Point SolidWorks, 3Dcontrol

Woher kommt denn dieser Punkt, wie kann man ihn ausblenden?
In einigen Solidworks Modellen wird der Mittelpunkt dargestellt, in einigen nicht. Die Suche in den SolidWorks 2012 Optionen oder Dokumenteneinstellungen bringt kein Ergebnis.
Die Einstellung gehört zu 3DControl (Vers. 2.18.1) : \\SWX\3Dcontrol\Properties\Options\Show Center = Always | On Motion | Never.
Der Mittelpunkt wird erst dargestellt, wenn die Datei gespeichert, geschlossen und neu aufgerufen wurde. Neu laden nach dem Speichern reicht nicht. Die Modelle ohne Anzeige sind also nur die neu angelegten, bisher nicht gespeicherten.  
 

Mittwoch, April 24, 2013

Was steht in der .LNK Datei?

Normalerweise reicht im Explorer ein Rechtsklick auf  den Shortcut, um die Eigenschaften zu sehen. Unter dem Tab Verknüpfung sieht man diese dann.

Mit Powershell geht das so:

$sh = New-Object -COM WScript.Shell
$sh.CreateShortcut((gci '.\LinkDatei.lnk').fullname)

Dienstag, März 26, 2013

Kontextmenüs mit Snipping Tool fotografieren

Problem:
Versucht man ein geöffnete Kontext Menü durch Klicken des Neu - Buttons des Snipping Tools zu fotografieren, dann geht das nicht. Durch das Klicken in das Snipping Tool verliert die zu fotografierende Anwendung den Fokus und schließt das Kontext Menü.
Lösung:
Snipping Tool in Bereitschaft bringen: //Start Snipping Tool/Neu/Abbrechen
In der Anwendung das Kontextmenü mit RMB öffnen
Durch Tastenkombination Strg+Drucken wird das Snipping Tool aktiv ohne die Anwendung verlassen zu müssen.
Das Kontextmenü kann aufgezeichnet werden.

Mittwoch, März 20, 2013

Hotmail Link auf Windows Taskleiste

Nachdem der alte Messenger durch Skype ersetzt wurde und Hotmail durch Live-Mail und mittlerweile Outlook356 braucht man zum Aufrufen der Hotmail nur noch einen Link. Um diesen in die Taskleiste zu bekommen benötigt man folgenden Klimmzug:

1. auf Desktop neue Verknüpfung erstellen
2. Speicherort des Elements ist die Adresse des Browsers ihres Vertrauens und die URL
z.B.:
"C:\Program Files (x86)\Internet Explorer\iexplore.exe" https://dub122.mail.live.com/default.aspx?rru=inbox&CTT=6
3. Eventuell noch das Icon Anpassen:
%ProgramFiles% (x86)\Windows Live\Messenger\msnmsgr.exe
4. Jetzt hat das RMB Mmenü des Links auf dem Desktop den Eintrag an Taskleiste anheften, den gibt es offensichtlich nur bei Verknüpfungen auf ausführbare Programme.
5. Verknüpfung an Taskleiste Anheften, auf Desktop löschen, fertig