Archive for Dezember 2017

Passwörter in Powershell generieren

28 Dezember 2017

Über eine .Net-Framework-Funktion kann man ganz einfach relativ sichere Passwörter erzeugen.

Add-Type -AssemblyName System.Web
$pw=[System.Web.Security.Membership]::GeneratePassword(10,1)
$pw

$pw enthält nun ein Passwort mit 10 Stellen und mindestens einem Sonderzeichen. Die 1 gibt immer nur die Mindestanzahl an Sonderzeichen an, es kann auch passieren, dass mehrere Sonderzeichen enthalten sind.

Um die Einfachheit eines Passworts bestimmen zu können, kann man diese Entropie-Funktion benutzen:

function Get-Entropy
{
    Param (
        [Parameter(Mandatory = $True)]
        [ValidateNotNullOrEmpty()]
        [Byte[]]
        $Bytes
   )
 
   $FrequencyTable = @{}
   foreach ($Byte in $Bytes) {
       $FrequencyTable[$Byte]++
   }
   $Entropy = 0.0
 
   foreach ($Byte in 0..255)
   {
       $ByteProbability = ([Double]$FrequencyTable[[Byte]$Byte])/$Bytes.Length
       if ($ByteProbability -gt 0)
       {
           $Entropy += -$ByteProbability * [Math]::Log($ByteProbability, 2)
       }
   }
   $Entropy
}

Sie stammt aus diesem tollen Artikel, der sich mit Get-Random und Zufallszahlen beschäftigt: http://www.powershellmagazine.com/2014/07/28/testing-the-effectiveness-of-get-random/.

Damit Get-Entropy verwendet werden kann, brauchen wir noch das Passwort als Byte-Array:

$pwb=[System.Text.Encoding]::ASCII.GetBytes($pw)
Get-Entropy $pwb

Verwendet man also ein einfaches Passwort wie z. B. nur Leerzeichen:

$pw="         "
Get-Entropy ([System.Text.Encoding]::ASCII.GetBytes($pw))

dann erhält man als Entropie 0 was schlecht ist. Verwendet man statt dessen aber obige GeneratePassword-Methode, dann erhält man in der Regel eine Entropie um 3,2:

$pw=[System.Web.Security.Membership]::GeneratePassword(10,1)
Get-Entropy ([System.Text.Encoding]::ASCII.GetBytes($pw))

Durch Verwendung von weiteren Stellen kann man die Entropie erhöhen. Wenn man den Passwordstring auch noch auf das Vorhandensein bestimmter Zeichen prüft, die zwingend enthalten sein müssen, könnte man die Entropie weiter erhöhen.

Wenn man eine Variante braucht, welche auch die Entropie von Dateien berechnen kann, der kann diese Funktion benutzen: https://www.powershellgallery.com/packages/PowerSploit/1.0.0.0/Content/ReverseEngineering%5CGet-Entropy.ps1. Im Prinzip die gleiche wie oben, nur um FileInfo mit ReadAllBytes erweitert.

Advertisements

Falschmeldungen von Virenscannern

19 Dezember 2017

Übereifrige Virenscanner können schon mal eine harmlose Software als gefährlich einstufen. Wenn man sich absolut sicher ist, dass eine Software Opfer einer falschen Klassifikation wurde, dann kann man solche sogenannten False Positives dem entsprechenden Antivirensoftwarehersteller melden.

Hier ein Link zu einer Seite, wo sich jemand viel Mühe zum Thema gemacht hat und von allen aktuellen Anbietern Adressen und Vorgehensweisen zum Einsenden von Fehlalarmen dokumentiert hat: https://www.techsupportalert.com/content/how-report-malware-or-false-positives-multiple-antivirus-vendors.htm

LoaderException bei Add-Type in Powershell

11 Dezember 2017

Will man in Powershell mittels Add-Type eine DLL Datei laden, so kann es passieren, dass der Versuch mit einer Ausnahme abgebrochen wird:

PS> add-type -path ‚C:\Program Files\PackageManagement\NuGet\Packages\MimeKit.1.22.0\lib\net451\MimeKit.dll‘
add-type : Mindestens ein Typ in der Assembly kann nicht geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen benötigen.
In Zeile:1 Zeichen:1
+ add-type -path ‚C:\Program Files\PackageManagement\NuGet\Packages\Mim …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
    + FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeComma
   nd

Schön solche umfassenden Fehlermeldungen, wo bekomme ich nun aber die LoaderException-Eigenschaft her? Das Fehlerobjekt liefert zunächst nix brauchbares. Der Parameter –Force ist wichtig damit alle Eigenschaften angezeigt werden:

PS> $error|fl * -Force

PSMessageDetails      :
Exception             : System.Reflection.ReflectionTypeLoadException: Mindestens ein Typ in der Assembly kann nicht
                        geladen werden. Rufen Sie die LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen
                        benötigen.
                           bei System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
                           bei System.Reflection.Assembly.GetTypes()
                           bei Microsoft.PowerShell.Commands.AddTypeCommand.LoadAssemblyFromPathOrName(List`1
                        generatedTypes)
                           bei Microsoft.PowerShell.Commands.AddTypeCommand.EndProcessing()
                           bei System.Management.Automation.CommandProcessorBase.Complete()
TargetObject          :
CategoryInfo          : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
ErrorDetails          :
InvocationInfo        : System.Management.Automation.InvocationInfo
ScriptStackTrace      : bei <ScriptBlock>, <Keine Datei>: Zeile 1
PipelineIterationInfo : {}

Aber es gibt bei der Exception-Eigenschaft etwas:

PS> $Error.Exception|fl -Force

Types            : {MimeKit.MimeParser, MimeKit.AttachmentCollection, MimeKit.BodyBuilder,
                   MimeKit.ContentDisposition…}
LoaderExceptions : {System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   , System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   , System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   , System.IO.FileNotFoundException: Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0,
                   Culture=neutral, PublicKeyToken=0e99375e54769942" oder eine Abhängigkeit davon wurde nicht
                   gefunden. Das System kann die angegebene Datei nicht finden.
                   Dateiname: "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942"

                   WRN: Protokollierung der Assemblybindung ist AUS.
                   Sie können die Protokollierung der Assemblybindungsfehler aktivieren, indem Sie den
                   Registrierungswert [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) auf 1 festlegen.
                   Hinweis: Die Protokollierung der Assemblybindungsfehler führt zu einer gewissen Leistungseinbuße.
                   Sie können dieses Feature deaktivieren, indem Sie den Registrierungswert
                   [HKLM\Software\Microsoft\Fusion!EnableLog] entfernen.
                   …}
Message          : Mindestens ein Typ in der Assembly kann nicht geladen werden. Rufen Sie die
                   LoaderExceptions-Eigenschaft ab, wenn Sie weitere Informationen benötigen.
Data             : {}
InnerException   :
TargetSite       : System.RuntimeType[] GetTypes(System.Reflection.RuntimeModule)
StackTrace       :    bei System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
                      bei System.Reflection.Assembly.GetTypes()
                      bei Microsoft.PowerShell.Commands.AddTypeCommand.LoadAssemblyFromPathOrName(List`1
                   generatedTypes)
                      bei Microsoft.PowerShell.Commands.AddTypeCommand.EndProcessing()
                      bei System.Management.Automation.CommandProcessorBase.Complete()
HelpLink         :
Source           : mscorlib
HResult          : –2146232830

Da der ganze kram Drumherum in diesem Fall nicht interessiert, ist diese Zeile zielführend:

PS> $error[0].exception.loaderexceptions[0]
Die Datei oder Assembly "BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942" oder
eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.

Also kurz gesagt, es fehlt eine andere Assembly bzw. DLL-Datei, in diesem Fall BouncyCastle. Wenn also bei einer LoaderException bei Add-Type ein Problem auftaucht hilft diese Zeile:

$error[0].exception.loaderexceptions[0]

Bildschirminhalt einer virtuellen Maschine im Hyper-V Server abrufen

6 Dezember 2017

Wenn man auf einem Microsoft Hyper-V Server (https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/hyper-v-server-2016) unterwegs ist, also der frei verfügbaren Version, dann hat man manchmal das Problem, dass man wissen möchte, warum eine virtuelle Maschine noch nicht ansprechbar ist. Meist hat es mit einem Hänger oder mit blöden Updates zu tun. Falls man nun aber direkt auf der Konsole des Servers ist, dann gibt es keine direkten grafischen Mittel die passenden Infos abzurufen.

Aus diesem Grund hab ich ein Script gebastelt, damit man in Zukunft die passenden Funktionen direkt verfügbar hat. Hier zunächst die Ausgangslage, wie man das Bild einer virtuellen Maschine speichert (https://blogs.msdn.microsoft.com/virtual_pc_guy/2016/05/27/capturing-a-hyper-v-vm-screen-to-a-file/) daraus resultierte dieses abgewandelte Skript:

Daraus ergeben sich die Funktionen:

# speichern in eine Datei
Save-VMScreen –VMName SampleVMName –Filename ".\test.bmp"

# direkte Ausgabe am Bildschirm
Show-VMScreen  –VMName SampleVMName

Man kann noch einen Parameter –Index angeben, dieser ist als Vorgabe 0 und spricht einen spezifischen Videohead an. Wie dieser genau definiert ist, ließ sich leider nicht herausfinden. Aber kurz gesagt, kann man damit höher aufgelöste Bilder erhalten.

Man kann sogar das aktuelle Bild in die Windows-Zwischenablage legen, damit man es für Dokuzwecke woanders wieder einfügen kann:

[System.Windows.Forms.Clipboard]::SetImage((Get-VMScreenBMP "SampleVMName"))

Letzte abgestürzte Chrome Sessions Tabs wiederherstellen

5 Dezember 2017

Wenn man, wie ich, Chrome Tabs sammelt um ja nichts zu vergessen, dann kann es in einer ungünstigen Situation passieren, dass man diese z. B. durch einen Neustart des Rechners verliert, oder wenn jemand anderes einfach herumklickt und Chrome öffnet ohne die alten Sessions wiederherzustellen. Zum Glück gibt es aber eine recht einfache Methode die alten Sitzungen wiederherzustellen.

Hier wird der grundsätzliche Weg beschrieben: https://superuser.com/questions/342437/how-to-restore-chrome-without-restore-button-and-the-files-last-session-and/639956#639956.

Hier nochmal der Weg in meinen Worten:

Bestehende Chrome Instanz im Taskmanager beenden

Stop-Process Chrome* –Force

und ins Verzeichnis

CD "$Env:LocalAppData\Google\Chrome\User Data\Default"

wechseln, dann

ren "Current Session" "Current Session.old"
ren "Current Tabs" "Current Tabs.old"
ren "Last Session" "Current Session"
ren "Last Tabs" "Current Tabs"

Nun kann man Chrome wieder starten.