netzwerkdude
Goto Top

PowerShell Skripte für das Datei Kontextmenü erstellen - am Beispiel VirusTotal API

Moin,

wenn ihr ein Tool habt das mit einer Datei "irgendwas" macht und das Tool von Usern benutzt werden soll die keinen Bock auf die Kommandozeile haben, kann man PowerShell .ps1 skripte auf eine angeklickte Datei über das Rechtsklick-Kontextmenü anwenden.

Als erstes erstellen wir das Kontextmenü:
Im Regedit unter
Computer\HKEY_CLASSES_ROOT\*\shell\
erstellt man einen Schlüssel mit beliebigen Namen, als Standardwert kommt der Name des zukünftigen Tools rein, hier "VirusTotalCheck"
nun erstellt ihr unter dieser Schlüssel einen weiteren mit dem namen "command"
Hier kommt als Standardwert der Befehl der ausgeführt werden soll beim klick:
"C:\Program Files\PowerShell\7\pwsh.exe" -File "D:\Code\006_KleineTools\VirusTotalChecker.ps1" "%V"   
(Führe Powershell 7 aus, das Skript unter dem Pfad und als Parameter übergebe die angeklickte Datei (%V)

So schauts aus:
clipboard01

Und schon erscheint es im Kontextmenü:
clipboard02

Hier als Regdatei zum direkt importieren:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Virustotalcheck]
@="VirusTotalCheck"  

[HKEY_CLASSES_ROOT\*\shell\Virustotalcheck\command]
@="\"C:\\Program Files\\PowerShell\\7\\pwsh.exe\" -File \"D:\\Code\\006_KleineTools\\VirusTotalChecker.ps1\" \"%V\" "  
(Hier das ganze escaping beachten!)


Jetzt können wir also auch das Skript in D:\Code\006_KleineTools\VirusTotalChecker.ps1 ablegen, hier der Code (bitte nicht allzu representativ nehmen, habe den mal schnell gehackt um was sinnvolles zu machen face-smile )
bitte eueren eigenen API Key von VirusTotal eintragen in die Variable $APIKey in Zeile 7

#Requires -Version 7.0

param(
    $FileToProcess
)

$APIKey = "hier_eueren_key_rein, hier bei google registrieren: https://www.virustotal.com/gui/join-us"  
$FileHash = (Get-FileHash -Algorithm SHA1 -Path $FileToProcess).Hash

Write-Host "Prüfe $FileToProcess"  
Write-Host "File SHA1 Hash: $FileHash"  

function check_filesizelimit {
    If ((Get-Item $FileToProcess).length -ge 33554432) {
        Write-Host "Sorry, public VT API supports only up to 32MB :(" -ForegroundColor Magenta  
        Read-Host "Any Key to close..."  
        Exit 1
    }
}


function submit_hash {
    param(
        $Hash = $FileHash
    )

    $URL="https://www.virustotal.com/vtapi/v2/file/report"  
    $postParams = @{
    apikey=$APIKey
    resource=$Hash
    }
    
    try {
        $Result = Invoke-WebRequest -Uri $URL -Method Post -Body $postParams
    }    
    catch {
        Write-Host "Could not Check Hash with Virustotal DB, please check manually" -ForegroundColor Yellow  
        Read-Host "Press any Key to close"  
        Exit 1
    }
    $ResultAsJSON = $Result.Content| ConvertFrom-Json
    $ResultAsJSON
}



function submit_file {
    param(
        $FileToUpload
    )

    $URL="https://www.virustotal.com/vtapi/v2/file/scan"  
    $postParams = @{
    apikey=$APIKey
    file=Get-Item -Path $FileToUpload
    }

    check_filesizelimit

    try {
        $Result = Invoke-RestMethod -Uri $URL -Method Post -Form $postParams
    }
    catch {
        Write-Host "Could not Uplaod to Virustotal, please check manually" -ForegroundColor Yellow  
        Read-Host "Press any Key to close"  
        Exit 1
    }
    $Result
}

$HashResult = submit_hash

    if ($HashResult.response_code -eq 0) {
        $HashResult.verbose_msg
        Write-Host "This File(hash) is not in the VirusTotal Database, so no Scan Results for it" -ForegroundColor Green  
        $Answer = Read-Host "Would you like to submmit it (WARNING: Uploads file to Google! please think before proceeding! (Y/N)"  
            
            If ($Answer -like "Y") {  
                $Submitresult = submit_file -FileToUpload $FileToProcess
                $Submitresult.verbose_msg
                $Hash = $Submitresult.sha1
                
                While ($Submitresult.verbose_msg -match 'queued' ) {  
                    Write-Host "Waiting 60 seconds to fetch the Result"  
                    Start-Sleep -Seconds 60
                    $Submitresult = submit_hash -Hash $Hash
                    Write-Host $Submitresult
                }
                
                Write-Host "Report for the Submitted File" -ForegroundColor Green  
                $Submitresult
                Write-Host "Positives: $($Submitresult.positives)" -ForegroundColor Magenta  
            }
    }

    else {
        Write-Host "Report for the File(hash):" -ForegroundColor Green  
        $HashResult
        Write-Host "Positives: $($HashResult.positives)" -ForegroundColor Magenta  
    }

Read-Host "Press Any Key to close"  

MFG
N-Dude

PS: Der Code läuft nicht mit PowerShell 5.x, das liegt an der Invoke-Restmethod anweisung die 7er features benutzt. Außerdem wird die "depricated" v2 VirusTotal API benutzt, aber die neue ist wohl noch Beta - versteh einer Google....

Content-ID: 596999

Url: https://administrator.de/contentid/596999

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

TK1987
TK1987 17.08.2020 aktualisiert um 16:18:03 Uhr
Goto Top
Moin,

Zitat von @NetzwerkDude:
Im Regedit unter
Computer\HKEY_CLASSES_ROOT\*\shell\
erstellt man einen Schlüssel mit beliebigen Namen, als Standardwert kommt der Name des zukünftigen Tools rein, hier "VirusTotalCheck"
Diese Methode hat jedoch einen Nachteil: Es kann immer nur eine Datei als Argument an das Skript übergeben werden (bzw. wird bei einer Multiselektion für jede Datei eine neue Instanz geöffnet).

Eine Alternative hierzu, die es auch ermöglicht mehrere Dateien als Argumente an das Skript zu übergeben, ist der SendTo Ordner.

1) Explorer Öffnen und in der Adressleiste shell:sendto eingeben (man landet im Ordner %userprofile%\AppData\Roaming\Microsoft \Windows\SendTo)
2) Hier nun eine Verknüpfung des Powershell-Skripts anlegen; und das Verknüpfungsziel wie folgt abändern
powershell -EP ByPass -File "C:\Pfad\zum\Skript.ps1"  

Nun kann man im Explorer nach belieben mehrere Dateien selektieren und über das Kontextmenü "Senden an" als Array an das Skript übergeben.

sendto

Die Argumente sind dann (sofern nicht unter Parameter eine andere Variable definiert wurde), unter der Variable $Args zu erreichen.

Gruß Thomas
NetzwerkDude
NetzwerkDude 17.08.2020 um 16:04:55 Uhr
Goto Top
Danke für den Hinweis face-smile
TK1987
TK1987 17.08.2020 um 16:09:32 Uhr
Goto Top
Aber gerne doch face-wink