Montag, September 19, 2016

Powershell 32|64 bit

"You are running the {0}bit Version of Powershell" -f ([intptr]::size*8)

Samstag, September 17, 2016

Powershell remotesigned, SysWow64, Runas

Beim Installieren meines bell.ps1 scriptes gab es mehrere Stolperstellen:

1. Das kopierte Script wird als Remote betrachtet und erwartet entsprechend eine Signierung
- Variante 1: Datei lokal neu erstellen (Datei umbenennen/neu anlegen, Inhalt kopieren)
- Variante 2: Clear-Content -Path 'C:\users\public\bell.ps1' -Stream 'Zone.Identifier'
- ZI Setzen : Add-Content -Path 'C:\users\Public\bell.ps1' -Value "[ZoneTransfer]`nZoneId=3" -Stream 'Zone.Identifier'
- ZI Ansehen: Notepad C:\users\Public\bell.ps1:zone.identifier

2. Windows 10 und intPTR:
das unter Windows 7/64 lauffähige script läuft unter W10 nur noch unter Powershell 32 bit:

Start-Process -Verb runas -FilePath C:\windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

Die Anpassung des Scriptes an die geänderte Pointerbehandlung ist in Arbeit.

3. Achtung: beide Versionen 64/32 haben eigene Einstellungen zu Set-ExecutionPolicy, die per Default restricted ist, aber bequemerweise RemoteSigned sein sollte

4. Powershell als Admin auszuführen:

Start-Process -Verb runas -FilePath C:\windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

5. weitere Tipps: Geek, wosHub

Netplwiz - Anmeldung mit gespeichertem Password

Win+R netplwiz.exe

Benutzer müssen Namen und Passwort eingenben: aus


Mittwoch, August 17, 2016

Get-NtpTime , Powershell Funktion

Wie spät ist es eigentlich? Manchmal setzt die ntp- Abfrage einfach aus und die PC Zeit läuft so nach und nach hinterher, oder auf und davon. Also gelegentlich prüfen, z.B. mit folgender Funktion:
#ibjs.net 20160817 Abfragefunktion für NTP, Auswertung der deutschen w32tm Ausgabe
$NTP_Server=@("ptbtime1.ptb.de", "ptbtime2.ptb.de", "ptbtime3.ptb.de", `
"pool.ntp.org","europe.pool.ntp.org","de.pool.ntp.org ",`
"time-a.nist.gov","time-b.nist.gov ")
Function Get-NtpTime{
Param($Server)
If (! $Server){$Server="ptbtime1.ptb.de"}
$NTPResponse={(iex "w32tm /stripchart /computer:$Server /dataonly /samples:0")[2]}
$NTPTime={get-date([regex]::Replace("$(&$NTPResponse)","([\D\s]+)([\d\. :]+)\.",'$2'))}
&$NTPTime
}
$NTP_Server|%{"{0,-20}{1}" -f $_,(Get-NtpTime $_)}
view raw Get-NtpTime.ps1 hosted with ❤ by GitHub

Freitag, August 05, 2016

Hedda, wie spät ist es?

Zeitansage mit Powershell und passender Sprachdatei (bei Windows 7 nachrüsten):


#ibjs.net 20169806
Add-Type -AssemblyName System.speech
$Hedda=New-Object `
System.Speech.Synthesis.SpeechSynthesizer
$hedda.SelectVoice(`
($hedda.GetInstalledVoices().voiceinfo|?{$_.name -match "Hedda"}).name)
$GD=@'
$D=get-date
$S="Heute ist {0} der {1} {2} {3}. Es war gerade {4} Uhr und {5} Minuten und {6} Sekunden" -f `
$D.tostring("dddd"),$D.day,$D.tostring("MMMM"),$D.year,$D.hour,$D.minute,$D.second
$Hedda.speak($S)
'@
$Zeitansage={iex $GD}
&$Zeitansage
#Call Operator, Script Block, Invoke Expression und Here String in eier Reihe
view raw Zeitansage.ps1 hosted with ❤ by GitHub

Mittwoch, August 03, 2016

FritzBox Dialer mit Powershell

Diese Übung galt der Umstellung des FritzBox Wahlhilfe Scriptes fb_dial.vbs von Michael Engelke auf eine Powershell Variante.

#IBJS.net 20160803, in Anlehnung an fb_dial.vbs von Michael Engelke 2012
#Fritz!Box Wählhilfe mit Powershell von Joachim Schubert ibjs.net 2016
#Der Fritz-Box Benutzername für diesen Konstellation lautet NAS-Read
#Das encrypted Fritz-Box Passwort ist vorher in einer Datei Securestring.fb abzulegen.
#ConvertFrom-SecureString (read-host -AsSecureString -Prompt "Passwort ") >SecureString.fb
#Als Default Rufnummer nehme ich hier die Zeitansage der Telekom, die aber kostenpflichtig ist
#Alternativ nehme ich zum Testen eine interne Nummer wie **610, damit kann ich es zwar klingeln lassen,
#kann aber bisher die internen Gespräche nicht an das Wahlgerät **613 übergeben, es legt sofort auf.
#Zum Aufbau einer Verbindung lege ich eine sonst unbenutzte Festnetznummer auf das Zielgerät.
#Erprobung an Windows 7/ Powershell 5/ Gigaset A415 **613, Gigaset SL1 **610/ FritzBox 6360/Unity Media VoIP
#Die Übergabe des Anrufs erfolgt so:
#Das Script baut die Verbindung auf und zeigt es mit einem Rufzeichen= 3x Kammerton an.
#Sobald zu hören, am Wahlgerät die grüne Rufannahmetaste solange drücken, bis Wählhilfe Nummer am Display erscheint (ca. 1s)
#Das Rufzeichen ist am Wählgerät zu hören.
#
#Einbindung als Telefondienst per Registry:
#HKEY_CLASSES_ROOT\tel\shell\open\command
#[Reg_SZ]: "C:\WINDOWS\System32\WScript.exe" "C:\Windows\fb_dial.vbs" '%1' # altes vbs script wird nun ersetzt:
#[Reg_SZ]: "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "C:\Windows\fb-dial.ps1" '%1'
#Dieses Script und SecureString.fb kommen nach C:\windows
#mit tel:01804100100 kann nun gewählt werden
#
Param([string]$Nummer="0180 4100100") #Zeitansage Telecom für 20 ct
#
function md5($text){
$md5 = New-Object System.Security.Cryptography.MD5CryptoServiceProvider
$md5.ComputeHash([Text.Encoding]::utf8.getbytes($text))|%{$HC=''}{$HC+=$_.tostring("x2")}{$HC}
}
#
#Achtung [string] im Parameter nicht vergessen sonst wird aus 0175… -> 175…
#und sie lernen einen Anschluss Ihrer Nachbarschaft kennen
#
Function dial([string]$Nummer){
if (!$Nummer){$Nummer="**610"}
#Nummernumwandlungfür Fritz in De, ohne Telefonanlage
$Nummer=([regex]::Replace($Nummer,"(?i)^tel:",""))
$Nummer=([regex]::Replace($Nummer,"^\+","00"))
$Nummer=[regex]::Replace($Nummer,"[^0-9*]","")
$Nummer=[regex]::Replace($Nummer,"0049","0")
$Password=get-content .\securestring.fb|ConvertTo-SecureString
$user="NAS-Read"
$hostfb="http://fritz.box" #$Host wird vom OS genutzt
$page_login= "/login_sid.lua"
$page_dial= "/fon_num/fonbook_list.lua?dial="+$Nummer+"&sid="
$page_logout="/fon_num/fonbook_list.lua?logout=1&sid="
$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
$pass=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($Ptr)
$R1 = Invoke-WebRequest ($hostfb+$page_login)
$Challenge=([xml]$R1).sessioninfo.challenge
$Code1=$Challenge+"-"+$Pass
$Code2=[char[]]$Code1|%{$Code2=""}{$Code2+=$_+[Char]0}{$Code2}
$Response= "response=" + $Challenge + "-" + $(md5($Code2))
$Response+="&username="+$user #Response ist die Antwort auf die Challenge
$R2=Invoke-WebRequest -Uri ($hostfb+$page_login) -Method Post -Body $Response
$SID=([xml]($R2.Content)).ChildNodes.sid
$URiDial= $hostfb+$page_dial+$SID
$URILogout=$hostfb+$page_logout+$SID
$RequestCall=Invoke-WebRequest -Uri $URIDial
$RequestLogout=Invoke-WebRequest -Uri $URILogout
1..3|%{[console]::beep(440,1000);start-sleep(1)}
}
dial $Nummer
view raw fb-dial.ps1 hosted with ❤ by GitHub

Mittwoch, Mai 04, 2016

Blogger+Code+Github

Wie kann Code am einfachsten veröffentlicht werden?

Wahrscheinlich mit GitHub.

https://gist.github.com

Dann bei Bedarf: create Secret|Public Gist, mit Name des Scripts, Bezeichnung, Kommentar....
Dann einbinden in Blogger , per copy des embed Inhaltes in die HTML Ansicht von Blogger.
Das entsprechende Script ist nicht unter Registerkarte Verfassen sichtbar, sondern nach Aufruf von Vorschau.

Powershell Beep:

#ibjs.net 20160504
1..3|%{[console]::beep(440,1000);start-sleep -seconds 1.5}
#F-A-C = Keyboard IDs 45,49,52
45,49,52|%{27.5*[math]::Pow(2,($_-1)/12)}|%{[console]::beep($_,1000)}
view raw Beep-3times.ps1 hosted with ❤ by GitHub

Dropbox + SnippingTool Problem

Problem:
DropBox 3.18.1 verhindert unter Windows 7 die Nutzung von Strg+Druck des OS eigenen SnippingTool und versucht statt dessen, selbst ScreenShots zu erstellen und zu verwalten.

Lösung:
uncheck: //DropBox/Einstellungen/Allgemein/"DropBox beim Systemstart starten"
starte Dropbox selbst, nachdem SnippingTool bereits läuft, mit  eigenem Script:

//Systemsteuerung/Verwaltung/Aufgabenplanung/Aktionen/Aufgabe erstellen

Allgemein/Name: DropBox Start mit SnippingTool:
Trigger: bei Anmeldung
Aktion: Programm starten
Programm: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Argumente: -command C:\users\Public\Start-SnippingToolAndDropBox.ps1

Script:


#ibjs.net 20160504
<# Start des SnippingTools und gleichzeitiges Escape #>`
$wshell = new-object -com wscript.shell;`
Start-Process C:\Windows\system32\SnippingTool.exe;`
$wshell.SendKeys("{ESCAPE}")
start-sleep -Milliseconds 2000
#Jetzt wird erst Dropbox gestartet
& "C:\Program Files (x86)\Dropbox\Client\Dropbox.exe" /home
$DBHandles={try {(get-process -name dropbox -erroraction 'STOP').handles} catch {}}
$StopSnip={try {stop-process -name SnippingTool -ErrorAction 'STOP' -force} catch {}}
While ((& $DBHandles) -lt 1500) {};& $StopSnip

Bemerkung:
Die Anzahl der DBHandles = 1500 entspricht in etwa der Stelle, an der das DropBox Icon in der Notification Area der TaskBar meines Systems  den Status "Aktualisiert" anzeigt. Gegebenenfalls muss man diesen Wert selbt beim Start der eigenen Dropbox  beobachten und anpassen. Ob es einen direkten Weg zur Ermittlung dieses Ereignisses gibt, ist mir unbekannt.