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:
(Führe Powershell 7 aus, das Skript unter dem Pfad und als Parameter übergebe die angeklickte Datei (%V)
So schauts aus:
Und schon erscheint es im Kontextmenü:
Hier als Regdatei zum direkt importieren:
(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 )
bitte eueren eigenen API Key von VirusTotal eintragen in die Variable $APIKey in Zeile 7
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....
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"
So schauts aus:
Und schon erscheint es im Kontextmenü:
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\" "
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 )
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....
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 596999
Url: https://administrator.de/contentid/596999
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
3 Kommentare
Neuester Kommentar
Moin,
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
Nun kann man im Explorer nach belieben mehrere Dateien selektieren und über das Kontextmenü "Senden an" als Array an das Skript übergeben.
Die Argumente sind dann (sofern nicht unter Parameter eine andere Variable definiert wurde), unter der Variable $Args zu erreichen.
Gruß Thomas
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).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"
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.
Die Argumente sind dann (sofern nicht unter Parameter eine andere Variable definiert wurde), unter der Variable $Args zu erreichen.
Gruß Thomas