putilov_denis - stock.adobe.com

Mit ChatGPT PowerShell-Code schreiben und optimieren

Der Einsatz von KI-Tools ist in vielen Branchen auf dem Vormarsch und Administratoren können diese digitalen Helfer nutzen, um ihre Skripting-Versuche zu verbessern.

Das Interesse an künstlicher Intelligenz und der Frage, wie sie unser Leben erleichtern kann, hat stark zugenommen, auch im IT-Bereich.

Mit der Verbreitung von menschenähnlichen Chatbots und generativer KI, die verschiedene Medien produziert, ist KI scheinbar überall präsent. Wann immer es eine Technologie gibt, die die Arbeit eines Menschen nachahmen kann, neigt man dazu, ängstlich zu sein und sich zu fragen, ob Arbeitsplätze in Gefahr sind. Aber KI kann ein Segen sein, insbesondere für Administratoren, die Skripte in PowerShell erstellen und die derzeit verwendeten Skripte verbessern möchten. Ein besonders vielversprechendes Angebot ist ChatGPT von OpenAI, das PowerShell-Code schreiben, Ideen für die Codierung liefern und sogar Fehler in einem fehlerhaften Skript beheben kann.

Schauen wir uns genauer an, was ChatGPT ist, wie viel es kostet, wie man es mit PowerShell verwendet und worauf man achten muss.

Was ist ChatGPT?

ChatGPT ist das KI-Modell für natürliche Sprache von OpenAI, auf das Sie über ein webbasierte Chat-Schnittstelle zugreifen. Sie geben Eingabeaufforderungen – sogenannte Prompts – ein und die KI antwortet, ähnlich wie bei einer Online-Konversation. Es handelt sich um eine erstaunlich einfache und zugängliche KI.

Die kostenlose Version verwendet das GPT-3.5-Modell von OpenAI. Abonnenten, die pro Monat zahlen, erhalten ChatGPT Plus mit erweiterten Funktionen und können sowohl auf das GPT-3.5-Modell als auch auf das GPT-4-Modell zugreifen. Laut OpenAI bietet die kostenpflichtige Stufe eine schnellere Antwort, Zugang zu Spitzenzeiten sowie Zugang zum Browsing und zu Plug-ins.

OpenAI bietet auch ein Produkt namens ChatGPT Enterprise an, das kein öffentliches Preismodell hat, aber Berichten zufolge Verbesserungen in der Codierung aufweist und längere Eingaben verarbeiten kann.

Wenn Sie ChatGPT intensiv oder in einem professionellen Umfeld nutzen wollen, kann sich das Upgrade auf ChatGPT Plus lohnen. Für Gelegenheitsnutzer ist es wohl besser, bei der kostenlosen Version zu bleiben.

Wenn Sie ChatGPT oder eine andere KI von OpenAI integrieren, können Sie auch das nutzungsbasierte Modell über eine API verwenden, dessen Preise vom KI-Modell abhängen. Alle Beispiele in diesem Artikel beziehen sich auf die webbasierte Chat-Schnittstelle.

Um zu beginnen, eröffnen Sie ein Konto bei OpenAI auf der Login-Seite für ChatGPT.

Was sind die Vorteile der Verwendung von generativer KI für PowerShell-Skripte?

Ein Vorteil der PowerShell-Skripterstellung mit einer KI mit natürlichem Sprachmodell, wie ChatGPT, ist, dass Sie der KI sagen, was Sie wollen, und sie erstellt überzeugenden Code. Das ist eine effizientere Art, Code zu schreiben, als Suchbegriffe in Google einzugeben und die Informationen selbst zusammenzusetzen. Ihre Interaktionen mit ChatGPT sind dialogorientiert, sodass Sie die KI zu den gewünschten Informationen führen können, indem Sie auf früheren Antworten aufbauen.

Angenommen, Sie möchten ein Skript schreiben, um alle VMs in Azure mit einem bestimmten Tag zu finden und sie herunterzufahren. Vor der KI bestand Ihr Prozess darin, die Ausgabe des PowerShell-Befehls Get-AzVM zu untersuchen, nach einer Eigenschaft mit Tags zu suchen, nach denen gefiltert werden soll, und sich dann die Syntax des Cmdlets Stop-AzVM anzusehen. Sie können ChatGPT auffordern, das Skript zu schreiben:

Write a script that retrieves all virtual machines from Azure that have the tag 'shutdown' with the value 'daily' and then shuts those virtual machines down.

Auf Deutsch: Schreibe ein Skript, das alle virtuellen Maschinen von Azure abruft, die das Tag ‚shutdown‘ mit dem Wert ‚daily‘ haben, und diese virtuellen Maschinen dann herunterfährt.

Es wurde weder PowerShell angegeben, noch wurden irgendwelche Methoden vorgeschlagen, um die Aktion auszuführen. Hier ist das Skript, das erstellt wurde:

# Connect to Azure
Connect-AzAccount
 
# Define the resource group and tag criteria
$resourceGroup = "YourResourceGroup"
$tagName = "shutdown"
$tagValue = "daily"
 
# Retrieve the virtual machines with the specified tag
$vms = Get-AzResource -ResourceGroupName $resourceGroup -Tag @{ $tagName = $tagValue } | Where-Object {$_.ResourceType -eq "Microsoft.Compute/virtualMachines"}
 
# Stop each virtual machine
foreach ($vm in $vms) {
    $vmName = $vm.Name
    Write-Host "Stopping virtual machine: $vmName"
    Stop-AzVM -ResourceGroupName $resourceGroup -Name $vmName -Force
}

ChatGPT verwendete nicht das Cmdlet Get-AzVM, wie erwartet wurde. Stattdessen nutzte ChatGPT das Cmdlet Get-AzResource, das Links öffnet und nur Ressourcen mit dem angegebenen Tag abrufen kann. Diese Funktionalität war mir nicht bekannt, ich habe also etwas Neues gelernt.

Hervorzuheben ist auch, wie das Skript mit Ressourcengruppen umgeht. Das ChatGPT-PowerShell-Skript geht davon aus, dass sich die VMs in der gleichen Ressourcengruppe befinden. Jedes Objekt, das Get-AzResource ausgibt, enthält jedoch den Namen der Ressourcengruppe. Sie könnten stattdessen auf diesen Wert verweisen, um den Namen der Ressourcengruppe abzurufen.

Bitten Sie ChatGPT, das Problem mit der folgenden Eingabeaufforderung zu beheben:

The output from 'Get-AzResource' includes the resource group name, could you use that with 'stop-azvm' instead of hardcoding the resource group name?

Auf Deutsch: Die Ausgabe von Get-AzResource enthält den Namen der Ressourcengruppe. Kannst du das mit ‚stop-azvm‘ verwenden, anstatt den Namen der Ressourcengruppe fest zu kodieren?

Und ChatGPT antwortet mit einer neuen Version des Skripts:

# Connect to Azure
Connect-AzAccount
 
# Define the tag criteria
$tagName = "shutdown"
$tagValue = "daily"
 
# Retrieve the virtual machines with the specified tag
$vms = Get-AzResource -Tag @{ $tagName = $tagValue } | Where-Object {$_.ResourceType -eq "Microsoft.Compute/virtualMachines"}
 
# Stop each virtual machine
foreach ($vm in $vms) {
    $vmName = $vm.Name
    $resourceGroup = $vm.ResourceGroupName
    Write-Host "Stopping virtual machine: $vmName"
    Stop-AzVM -ResourceGroupName $resourceGroup -Name $vmName -Force
}

Mit diesem Skript ist die Aufgabe abgeschlossen.

Es ist wichtig, den Code sorgfältig zu überprüfen. In diesem Fall gibt das Skript im schlimmsten Fall einen Fehler aus, wenn Sie versuchen, eine VM mit der falschen Ressourcengruppe herunterzufahren. Wir haben den Fehler jedoch erkannt und die Korrektur vorgenommen, weil wir genug PowerShell-Kenntnisse hatten, um das Problem zu erkennen und ChatGPT zu bitten, es zu aktualisieren.

Wie man ChatGPT zur Verbesserung des PowerShell-Codes verwendet

Ein weiterer Vorteil der Verwendung von ChatGPT mit PowerShell ist die Fehlerbehebung oder Verbesserung von bestehendem Code. Angenommen, Sie haben das folgende Skript, das alle offenen TCP-Verbindungen abrufen und mit einem laufenden Prozess verknüpfen muss:

Get-NetTCPConnection | foreach-Object {
    [pscustomobject]@{
        LocalAddress = $_.LocalAddress
        LocalPort = $_.LocalPort
        RemoteAddress = $_.RemoteAddress
        RemotePort = $_.RemotePort
        State = $_.State
        OwningProcess = $_.OwningProcess
        CreationTime = $_.CreationTime
        PID = $_.OwningProcess
        Process = (Get-Process -Id $_.OwningProcess).Name
        UserName = (Get-Process -IncludeUserName -Id $_.OwningProcess).UserName
        Path = (Get-Process -Id $_.OwningProcess).Path
        SHA1 = try{(Get-FileHash (Get-Process -Id $_.OwningProcess).Path -Algorithm SHA1 | select-object -ExpandProperty Hash)}catch{};
        CommandLine = (Get-Process -Id $_.OwningProcess).CommandLine
    }
}

Auf dem Beispielcomputer dauert die Ausführung des Skripts etwa zwei Minuten. Sie können ChatGPT auffordern, den PowerShell-Code zu optimieren, um zu sehen, ob er schneller ausgeführt wird:

Can you optimize this PowerShell script for me?

<paste in code here>

Auf Deutsch: Kannst du dieses PowerShell-Skript für mich optimieren?

<Code hier einfügen>

ChatGPT antwortete mit dem folgenden aktualisierten PowerShell-Skript:

$tcpConnections = Get-NetTCPConnection
$connectionInfo = foreach ($connection in $tcpConnections) {
    $process = Get-Process -Id $connection.OwningProcess -ErrorAction SilentlyContinue
    [pscustomobject]@{
        LocalAddress   = $connection.LocalAddress
        LocalPort      = $connection.LocalPort
        RemoteAddress  = $connection.RemoteAddress
        RemotePort     = $connection.RemotePort
        State          = $connection.State
        OwningProcess  = $connection.OwningProcess
        CreationTime   = $connection.CreationTime
        PID            = $connection.OwningProcess
        Process        = if ($process) { $process.Name } else { $null }
        UserName       = if ($process) { $process.UserName } else { $null }
        Path           = if ($process) { $process.Path } else { $null }
        SHA1           = try { (Get-FileHash $process.Path -Algorithm SHA1).Hash } catch { $null }
        CommandLine    = if ($process) { $process.CommandLine } else { $null }
    }
}
$connectionInfo

Als der Code ausgeführt wurde, wurde ein Fehler erzeugt.

generierter PowerShell-Code
Abbildung 1: ChatGPT Plus generiert PowerShell-Code, der jedoch nicht beim ersten Versuch funktioniert.

Das ist bedauerlich, denn ChatGPT konnte nicht helfen. Ich fügte den Fehler wortwörtlich ein und bat ChatGPT, die Korrektur vorzunehmen, aber es gab immer wieder denselben Code aus, bis ich die Korrektur erklärte:

The SHA1 line, where you have the 'try catch' block, actually needs a semicolon at the end of the line for the code to work.

Auf Deutsch: Die SHA1-Zeile, in der du den ‚try catch‘-Block hast, braucht tatsächlich ein Semikolon am Ende der Zeile, damit der Code funktioniert.

Mit Hilfe produzierte ChatGPT funktionierenden Code, nachdem es das Semikolon in Zeile 18 hinzugefügt hatte. Die gute Nachricht ist, dass das aktualisierte Skript 35 Sekunden statt zwei Minuten braucht.

Die Optimierungsstrategie von ChatGPT für dieses Skript ist gut. Die erste Version des Skripts rief wiederholt das Cmdlet Get-Process auf und rief oft denselben Prozess über die ID ab. ChatGPT vermeidet diese Verlangsamung, indem es den zugehörigen Prozess einmal pro Schleife abfragt.

ChatGPT kann hilfreich sein, hat aber Tücken

Wie in den vorherigen Beispielen zu sehen ist, ist ChatGPT nicht perfekt. Sie sollten jeden Code, den es erzeugt, sorgfältig prüfen und ihn, insbesondere wenn Sie ihn nicht verstehen, mit Vorsicht ausführen. Sie sollten in Erwägung ziehen, den Parameter -WhatIf zu verwenden, um Änderungen anzuzeigen, bevor sie auftreten, oder Cmdlets auszublenden, die die Änderungen vornehmen, wenn Sie Tests ausführen.

Denken Sie daran, dass Sie als Benutzer von ChatGPT das Programm trainieren. Alles, was Sie verwenden, um ChatGPT aufzufordern und jeder Code, den Sie zur Prüfung einreichen, sollte nicht als privat betrachtet werden. Wenn Sie firmeneigenen Code schreiben, könnten Sie gegen die Richtlinien Ihres Unternehmens verstoßen, wenn Sie Skripte in ChatGPT einfügen.

Wenn Sie ChatGPT noch nicht ausprobiert haben, dann sollten Sie es tun. KI ist auf dem Vormarsch und ChatGPT ist unglaublich zugänglich und hat ein großzügiges kostenloses Angebot. Sie werden wahrscheinlich auf Bereiche stoßen, die ChatGPT nicht versteht oder bei der ersten Eingabeaufforderung nicht die gewünschten Ergebnisse liefert, aber Sie sollten es weiter versuchen. Es erfordert neue Fähigkeiten, um zu verstehen, wie man Anfragen anders formuliert oder einen neuen Ansatz in Betracht zieht, um den PowerShell-Code auf Ihre Aufgabe zuzuschneiden.

Erfahren Sie mehr über Künstliche Intelligenz (KI) und Machine Learning (ML)