In a Windows log analytics workspace, search for PowerShell processes that were used to enumerate network connections. Determine which PowerShell cmdlet was executed to list active TCP connections.
KQL answer reference and model-by-model benchmark comparison
f069f0f1-baad-4831-aa2b-eddac4baac4a
Question ID
19/23
Models Correct
1
Valid Answer
83%
Success Rate
Reference Answer
Human-validated correct answer for this question
Get-NetTCPConnection
Model Performance Comparison
See how different AI models performed on this question
| Model | Answer | KQL Query | Status | Attempts | Time | Cost |
|---|---|---|---|---|---|---|
| gemini-2.5-flash-preview-04-17 | Get-NetTCPConnection | DeviceProcessEvents
| where FileName =~ "powershell.exe" or FileName =~ "pwsh.exe"
| where ProcessCommandLine contains "Get-NetTCPConnection" or ProcessCommandLine contains "netstat"
| project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine | Correct | 1 | 12.94s | 0.0055 |
| gpt-35-turbo | Get-NetTCPConnection | DeviceProcessEvents
| where FileName == 'powershell.exe'
| where ProcessCommandLine has 'Get-NetTCPConnection' | Correct | 1 | 3.93s | 0.0033 |
| gpt-4-turbo-2024-04-09 | Get-NetTCPConnection | DeviceProcessEvents
| where FileName == 'powershell.exe'
| where ProcessCommandLine contains 'Get-NetTCPConnection' or ProcessCommandLine contains 'netstat'
| project TimeGenerated, DeviceName, InitiatingProcessCommandLine, ProcessCommandLine | Correct | 1 | 10.86s | 0.0533 |
| gpt-4.1 | Get-NetTCPConnection | DeviceProcessEvents
| where FileName =~ "powershell.exe"
| where ProcessCommandLine has_any ("Get-NetTCPConnection", "netstat", "Get-NetTCPConn")
| project TimeGenerated, DeviceName, AccountName, ProcessCommandLine
| extend ExecutedCmdlet = case(ProcessCommandLine has "Get-NetTCPConnection", "Get-NetTCPConnection", ProcessCommandLine has "Get-NetTCPConn", "Get-NetTCPConn", ProcessCommandLine has "netstat", "netstat", "Unknown") | Correct | 1 | 4.63s | 0.0117 |
| gpt-4.1-finetuned | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0845 |
| gpt-4.1-mini | Get-NetTCPConnection | DeviceProcessEvents
| where ProcessCommandLine has "powershell"
| where ProcessCommandLine has_any ("Get-NetTCPConnection", "netstat", "Get-NetConnectionProfile", "Get-NetUDPEndpoint")
| summarize Count = count(), SampleCommands = make_list(ProcessCommandLine, 10) by InitiatingProcessAccountName, DeviceName, FileName
| order by Count desc | Correct | 1 | 17.48s | 0.0022 |
| gpt-4.1-nano | Get-NetTCPConnection | DeviceProcessEvents
| where FileName in ('powershell.exe', 'pwsh.exe')
| where ProcessCommandLine contains 'Get-NetTCPConnection'
| project Timestamp, DeviceName, ProcessId, ProcessCommandLine, InitiatingProcessParentFileName, InitiatingProcessParentId
| order by Timestamp desc | Correct | 1 | 21.72s | 0.0005 |
| gpt-4o | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0640 |
| gpt-5-high | Get-NetTCPConnection | let psh_from_deviceevents =
DeviceEvents
| where ActionType in ("PowerShellCommand", "PowerShellScriptBlockLogging")
| extend ScriptText = tostring(iff(ActionType == "PowerShellScriptBlockLogging", AdditionalFields.ScriptBlockText, coalesce(AdditionalFields.Command, AdditionalFields.ScriptContent, AdditionalFields.CommandLine)))
| extend CommandName = tostring(AdditionalFields.CommandName)
| where CommandName =~ "Get-NetTCPConnection" or ScriptText has "Get-NetTCPConnection"
| extend Cmdlet = iif(isnotempty(CommandName), CommandName, extract(@"(?i)\b(Get-NetTCPConnection)\b", 1, ScriptText))
| project TimeGenerated, DeviceId, DeviceName, AccountName, InitiatingProcessAccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, Cmdlet, CommandText=coalesce(ScriptText, InitiatingProcessCommandLine);
let psh_from_processevents =
DeviceProcessEvents
| where (InitiatingProcessFileName in~ ("powershell.exe","pwsh.exe","powershell_ise.exe") or FileName in~ ("powershell.exe","pwsh.exe","powershell_ise.exe"))
| where ProcessCommandLine has "Get-NetTCPConnection"
| extend Cmdlet = extract(@"(?i)\b(Get-NetTCPConnection)\b", 1, ProcessCommandLine)
| project TimeGenerated, DeviceId, DeviceName, AccountName, InitiatingProcessAccountName, InitiatingProcessFileName, InitiatingProcessCommandLine, Cmdlet, CommandText=ProcessCommandLine;
union isfuzzy=true psh_from_deviceevents, psh_from_processevents
| extend ExecutingAccount = coalesce(AccountName, InitiatingProcessAccountName)
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), ExecCount=count(), SampleCommand=any(CommandText) by DeviceId, DeviceName, ExecutingAccount, Cmdlet
| extend StateFilter = extract(@"(?i)-State\s+([A-Za-z,]+)", 1, SampleCommand)
| order by LastSeen desc | Correct | 1 | 93.35s | 0.0461 |
| gpt-5-mini-high | Get-NetTCPConnection | // PowerShell processes used to enumerate network connections
DeviceProcessEvents
| where TimeGenerated between (startofday(ago(7d)) .. now())
| where FileName =~ 'powershell.exe' or FileName =~ 'pwsh.exe' or ProcessCommandLine has 'powershell' or ProcessCommandLine has 'pwsh'
// Look for common cmdlets and commands used to list TCP connections
| where ProcessCommandLine has_any ("Get-NetTCPConnection", "Get-NetUDPEndpoint", "Get-NetTCPStatistics", "Get-NetAdapter", "netstat", "ss -t", "Get-NetConnectionProfile", "Get-NetIPConnection")
| extend MatchedCommand = case(
ProcessCommandLine has "Get-NetTCPConnection", "Get-NetTCPConnection",
ProcessCommandLine has "netstat", "netstat",
ProcessCommandLine has "ss -t", "ss -t",
ProcessCommandLine has "Get-NetUDPEndpoint", "Get-NetUDPEndpoint",
ProcessCommandLine has "Get-NetTCPStatistics", "Get-NetTCPStatistics",
ProcessCommandLine has "Get-NetConnectionProfile", "Get-NetConnectionProfile",
ProcessCommandLine has "Get-NetIPConnection", "Get-NetIPConnection",
"other")
| summarize Count = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by DeviceName, AccountName, ProcessId, InitiatingProcessId, MatchedCommand, ProcessCommandLine
| order by LastSeen desc, Count desc
| project FirstSeen, LastSeen, Count, DeviceName, AccountName, ProcessId, InitiatingProcessId, MatchedCommand, ProcessCommandLine
| Correct | 1 | 10.67s | 0.0030 |
| gpt-5-mini-low | Get-NetTCPConnection | let powershellNames = dynamic(["powershell.exe","pwsh.exe","powershell_ise.exe"]);
let networkIndicators = dynamic(["Get-NetTCPConnection","Get-NetUDPEndpoint","Get-NetTCPStatistics","Get-NetIPStatistics","Get-NetIPAddress","Get-NetConnectionProfile","Get-NetTCPInfo","netstat","Get-NetTCP*","Get-Net*Connection","Get-Net*TCP","Get-Net*UDP"]);
// Helper: search DeviceProcessEvents (and DeviceEvents) for PowerShell and likely network enumeration commands
union isfuzzy=true
(
DeviceProcessEvents
| where FileName in (powershellNames) or tolower(ProcessCommandLine) contains "powershell" or tolower(ProcessCommandLine) contains "pwsh"
| extend CommandLine = tostring(ProcessCommandLine), EventSource = "DeviceProcessEvents", Time = TimeGenerated
),
(
DeviceEvents
| where FileName in (powershellNames) or tolower(ProcessCommandLine) contains "powershell" or tolower(ProcessCommandLine) contains "pwsh"
| extend CommandLine = coalesce(ProcessCommandLine, InitiatingProcessCommandLine), EventSource = "DeviceEvents", Time = TimeGenerated
)
| where isnotempty(CommandLine)
// Focus on command lines that contain likely network enumeration indicators
| where CommandLine matches regex @"(?i)\b(Get-NetTCPConnection|Get-NetUDPEndpoint|Get-NetTCPStatistics|Get-NetIPStatistics|Get-NetIPAddress|Get-NetConnectionProfile|Get-NetTCPInfo|netstat)\b"
| extend Matched = extract(@"(?i)\b(Get-NetTCPConnection|Get-NetUDPEndpoint|Get-NetTCPStatistics|Get-NetIPStatistics|Get-NetIPAddress|Get-NetConnectionProfile|Get-NetTCPInfo|netstat)\b", 1, CommandLine)
// Normalize common variations
| extend Matched = case(tolower(Matched)=="netstat","netstat", tostring(Matched))
| extend Matched = iif(isempty(Matched), "unknown", Matched)
| project Time, DeviceName, FileName, ProcessId, InitiatingProcessFileName, InitiatingProcessId, AccountName, AccountDomain, CommandLine, Matched, EventSource
| summarize Count = count(), SampleCommandLine = any(CommandLine), ExampleTime = min(Time) by Matched, DeviceName, FileName, ProcessId, InitiatingProcessFileName, InitiatingProcessId, AccountName, AccountDomain
| order by Count desc
| take 100
| Correct | 1 | 18.50s | 0.0049 |
| gpt-5-mini-medium | Get-NetTCPConnection | // Find PowerShell processes that enumerated network connections
union isfuzzy=true
DeviceEvents
, DeviceProcessEvents
| where TimeGenerated between (startofday(ago(7d)) .. now())
// Filter for PowerShell process executables or PowerShell in command line
| where (FileName has_cs "powershell" or FileName has_cs "pwsh" or ProcessCommandLine has_cs "powershell" or ProcessCommandLine has_cs "pwsh" or InitiatingProcessFileName has_cs "powershell" or InitiatingProcessFileName has_cs "pwsh" or InitiatingProcessCommandLine has_cs "powershell" or InitiatingProcessCommandLine has_cs "pwsh")
// Look for network enumeration cmdlets or tools commonly used
| where ProcessCommandLine has_cs "Get-NetTCPConnection" or ProcessCommandLine has_cs "Get-NetUDPEndpoint" or ProcessCommandLine has_cs "Get-NetTCPStatistics" or ProcessCommandLine has_cs "Get-NetUDPEndpoint" or ProcessCommandLine has_cs "netstat" or ProcessCommandLine has_cs "Get-NetTCP" or InitiatingProcessCommandLine has_cs "Get-NetTCPConnection" or InitiatingProcessCommandLine has_cs "Get-NetUDPEndpoint" or InitiatingProcessCommandLine has_cs "Get-NetTCPStatistics" or InitiatingProcessCommandLine has_cs "netstat" or InitiatingProcessCommandLine has_cs "Get-NetTCP"
// Extract the cmdlet/tool name
| extend Cmdlet = case(
ProcessCommandLine has_cs "Get-NetTCPConnection" or InitiatingProcessCommandLine has_cs "Get-NetTCPConnection", "Get-NetTCPConnection",
ProcessCommandLine has_cs "Get-NetUDPEndpoint" or InitiatingProcessCommandLine has_cs "Get-NetUDPEndpoint", "Get-NetUDPEndpoint",
ProcessCommandLine has_cs "Get-NetTCPStatistics" or InitiatingProcessCommandLine has_cs "Get-NetTCPStatistics", "Get-NetTCPStatistics",
ProcessCommandLine has_cs "netstat" or InitiatingProcessCommandLine has_cs "netstat", "netstat",
ProcessCommandLine has_cs "Get-NetTCP", "Get-NetTCP",
"other")
| project TimeGenerated, DeviceName, FileName, ProcessId, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessId, Cmdlet, ReportId, TenantId
| summarize Count = count(), Samples = make_list(pack('TimeGenerated', TimeGenerated, 'DeviceName', DeviceName, 'ProcessId', ProcessId, 'ProcessCommandLine', ProcessCommandLine, 'InitiatingProcessId', InitiatingProcessId, 'InitiatingProcessCommandLine', InitiatingProcessCommandLine), 5) by Cmdlet
| order by Count desc | Correct | 1 | 12.69s | 0.0040 |
| gpt-5-nano-high | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0083 |
| gpt-5-nano-medium | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0078 |
| grok-3-beta | Get-NetTCPConnection | DeviceProcessEvents
| where FileName contains "powershell.exe" or InitiatingProcessFileName contains "powershell.exe"
| where ProcessCommandLine has_any ("Get-NetTCPConnection", "netstat", "Get-NetUDPEndpoint", "Get-Process", "network", "connection", "tcp")
or InitiatingProcessCommandLine has_any ("Get-NetTCPConnection", "netstat", "Get-NetUDPEndpoint", "Get-Process", "network", "connection", "tcp")
| project DeviceName, AccountName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine, Timestamp
| order by Timestamp desc | Correct | 1 | 12.13s | 0.0363 |
| grok-3-mini-beta | Get-NetTCPConnection | DeviceProcessEvents
| where FileName =~ 'powershell.exe'
| where ProcessCommandLine contains 'Get-NetTCPConnection' or ProcessCommandLine contains 'netstat'
| project TimeGenerated, DeviceName, AccountName, ProcessCommandLine
| order by TimeGenerated desc | Correct | 1 | 10.28s | 0.0016 |
| o1-high | Get-NetTCPConnection | DeviceProcessEvents
| where FileName =~ "powershell.exe" or FileName =~ "pwsh.exe" or FileName =~ "powershell_ise.exe"
| where ProcessCommandLine has "Get-NetTCPConnection"
| project TimeGenerated, DeviceName, AccountName, ProcessCommandLine
| order by TimeGenerated desc | Correct | 1 | 36.45s | 0.1994 |
| o1-low | Get-NetTCPConnection | DeviceProcessEvents
| where FileName in~ ("powershell.exe", "pwsh.exe")
| where ProcessCommandLine has "Get-NetTCPConnection"
| project TimeGenerated, DeviceName, AccountName, FileName, ProcessCommandLine | Correct | 1 | 23.29s | 0.1788 |
| o3-high | Get-NetTCPConnection | // Find PowerShell processes that enumerated network connections (e.g. active TCP)
// Time range is controlled by the portal (TimeGenerated)
let PowerShellHosts = dynamic(["powershell.exe","powershell_ise.exe","pwsh.exe","pwsh"]);
let NetEnumerationCmdlets = dynamic(["Get-NetTCPConnection","Get-NetUDPEndpoint","Get-NetIPConnection","netstat"]);
DeviceProcessEvents
| where FileName in~ (PowerShellHosts) // limit to PowerShell hosts (case-insensitive)
| where ProcessCommandLine has_any(NetEnumerationCmdlets) // command-line contains one of the enumeration cmdlets
| extend CmdletExecuted = tostring(extract(@"(?i)(get-nettcpconnection|get-netudpendpoint|get-netipconnection|netstat)",0,ProcessCommandLine))
| project TimeGenerated, DeviceName, AccountDomain, AccountName,
FileName, ProcessId, CmdletExecuted, ProcessCommandLine,
InitiatingProcessParentFileName, InitiatingProcessId
| sort by TimeGenerated desc | Correct | 2 | 46.64s | 0.0334 |
| o3-mini-high | Get-NetTCPConnection | DeviceProcessEvents
| where tolower(InitiatingProcessFileName) has "powershell"
| where tolower(InitiatingProcessCommandLine) has "nettcpconnection"
| extend PS_Cmdlet = extract(@"(Get-[^\s]+)", 1, InitiatingProcessCommandLine)
| where isnotempty(PS_Cmdlet)
| summarize Count = count() by PS_Cmdlet
| order by Count desc | Correct | 2 | 19.24s | 0.0198 |
| o3-mini-low | Get-NetTCPConnection | union DeviceProcessEvents, DeviceEvents
| where (FileName =~ "powershell.exe" or InitiatingProcessFileName =~ "powershell.exe")
| where InitiatingProcessCommandLine has "Get-NetTCPConnection"
| project TimeGenerated, DeviceName, InitiatingProcessCommandLine, ProcessId
| summarize Occurrences=count() by DeviceName, InitiatingProcessCommandLine
| order by Occurrences desc | Correct | 2 | 99.24s | 0.0219 |
| o4-mini-high | Get-NetTCPConnection | DeviceProcessEvents
| where FileName in ("powershell.exe", "pwsh.exe")
| where ProcessCommandLine contains "Get-NetTCPConnection"
| extend Cmdlet = extract(@"(Get-NetTCPConnection)", 1, ProcessCommandLine)
| summarize Count = count() by Cmdlet
| order by Count desc | Correct | 1 | 31.80s | 0.0129 |
| o4-mini-low | Get-NetTCPConnection | DeviceProcessEvents
| where FileName endswith "powershell.exe"
| where ProcessCommandLine has_any ("Get-NetTCPConnection", "Get-NetUDPEndpoint", "Get-NetTCPStats", "netstat")
| extend Cmdlet = extract(@"(?i)(Get-NetTCPConnection|Get-NetUDPEndpoint|Get-NetTCPStats|netstat)\b", 1, ProcessCommandLine)
| summarize Count = count() by Cmdlet
| order by Count desc | Correct | 1 | 39.37s | 0.0145 |