Created
April 6, 2016 22:14
-
-
Save danieltharp/c7754a2da87b2a517ddd76e2231e14c8 to your computer and use it in GitHub Desktop.
PowerShell script to find where a user is logged into on the network and disable their NIC.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ******************************************************************************** | |
# | |
# Script Name: DangItBobby.ps1 | |
# Version: 1.0.0 | |
# Author: bluesoul <https://bluesoul.me> | |
# Date: 2016-04-06 | |
# Applies to: Domain Environments | |
# | |
# Description: This script searches for a specific, logged on user on all or | |
# specific Computers by checking the process "explorer.exe" and its owner. It | |
# then enumerates the list and lets you choose a PC to disable the NIC on. Useful | |
# as a last-resort script to stop a ransomware infection in-progress. | |
# | |
# ******************************************************************************** | |
#Set variables | |
$progress = 0 | |
#Get Admin Credentials | |
Function Get-Login { | |
Clear-Host | |
Write-Host "Please provide admin credentials (for example DOMAIN\admin.user and your password)" | |
$Global:Credential = Get-Credential | |
} | |
Get-Login | |
#Get Username to search for | |
Function Get-Username { | |
Clear-Host | |
$Global:Username = Read-Host "Enter username you want to search for" | |
if ($Username -eq $null){ | |
Write-Host "Username cannot be blank, please re-enter username!" | |
Get-Username | |
} | |
$UserCheck = Get-ADUser $Username | |
if ($UserCheck -eq $null){ | |
Write-Host "Invalid username, please verify this is the logon id for the account!" | |
Get-Username | |
} | |
} | |
Get-Username | |
#Get Computername Prefix for large environments | |
Function Get-Prefix { | |
Clear-Host | |
$Global:Prefix = Read-Host "Enter as much of the computer name (prefix) as you can to shorten the search time or press Enter to scan all Computers" | |
# Add the * programmatically so it doesn't bark about no * or $. | |
$Global:Prefix += "*" | |
Clear-Host | |
} | |
Get-Prefix | |
#Start search | |
$computers = Get-ADComputer -Filter {Enabled -eq 'true' -and SamAccountName -like $Prefix} | |
$CompCount = $Computers.Count | |
Write-Host "Searching for $Username on $Prefix on $CompCount Computers`n" | |
#Create mutable array for catching computers that match. | |
$Global:HitsX = @() | |
$Global:Hits = {$HitsX}.Invoke() | |
#Start main foreach loop, search processes on all computers | |
foreach ($comp in $computers){ | |
$Computer = $comp.Name | |
$Reply = $null | |
$Reply = test-connection $Computer -count 1 -quiet | |
if($Reply -eq 'True'){ | |
if($Computer -eq $env:COMPUTERNAME){ | |
#Get explorer.exe processes without credentials parameter if the query is executed on the localhost | |
$proc = gwmi win32_process -ErrorAction SilentlyContinue -computer $Computer -Filter "Name = 'explorer.exe'" | |
} | |
else{ | |
#Get explorer.exe processes with credentials for remote hosts | |
$proc = gwmi win32_process -ErrorAction SilentlyContinue -Credential $Credential -computer $Computer -Filter "Name = 'explorer.exe'" | |
} | |
#If $proc is empty return msg else search collection of processes for username | |
if([string]::IsNullOrEmpty($proc)){ | |
$progress++ | |
write-host "Failed to check $Computer!" | |
} | |
else{ | |
$progress++ | |
ForEach ($p in $proc) { | |
$temp = ($p.GetOwner()).User | |
Write-Progress -activity "Working..." -status "Status: $progress of $CompCount Computers checked" -PercentComplete (($progress/$Computers.Count)*100) | |
if ($temp -eq $Username){ | |
write-host "$Username is logged on $Computer" | |
$Global:Hits.Add($Computer) | |
} | |
} | |
} | |
} | |
} | |
write-host "Search done!" | |
If ($Hits.Count -gt 1) { | |
Clear-Host | |
write-host "Select a PC to Inspect" | |
$i = 0 | |
foreach ($hit in $Hits) { | |
write-host "[$i] $hit" | |
$i++ | |
} | |
$selection = Read-Host "Select" | |
Get-WMIObject -Class Win32_NetworkAdapterConfiguration -ComputerName $Hits[$selection] -Credential $Credential | |
$index = Read-Host "Index value of NIC to disable, Ctrl+C to cancel" | |
$wmi = Get-WMIObject -Class Win32_NetworkAdapter -filter "Index LIKE $index" -ComputerName $Hits[$selection] -Credential $Credential | |
Write-Host "Processing. You may see a failed RPC call message appear if this is the only NIC with an actual network connection. That indicates the machine wasn't available to return a status message and thus was successful." | |
$wmi.disable() | |
Write-Host "Disabled!" | |
} | |
ElseIf ($Hits.Count -eq 1) { | |
$Computer = $Hits[0] | |
Get-WMIObject -Class Win32_NetworkAdapterConfiguration -ComputerName $Computer -Credential $Credential | |
$index = Read-Host "Index value of NIC to disable on $Computer, Ctrl+C to cancel" | |
$wmi = Get-WMIObject -Class Win32_NetworkAdapter -filter "Index LIKE $index" -ComputerName $Hits[0] -Credential $Credential | |
Write-Host "Processing. You may see a failed RPC call message appear if this is the only NIC with an actual network connection. That indicates the machine wasn't available to return a status message and thus was successful." | |
$wmi.disable() | |
Write-Host "Disabled!" | |
} | |
Else { Write-Host "Not logged on to any machine searched for." } |
if you want to runit from a list of computers, all you need to do is replace the prefix section and the AD-computers search (line 43 to 57) with an import of the file either using Get-Content or import-csv, with the device names one per line
either that or modify the get-adcomputers filter with -and operatingSystem - like "Server"
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Is there a way to modify this WONDERFUL script to run from a text file of servers instead of asking for a prefix? When I just hit to have it look for all servers it finds some workstations in the results.... so I can just feed it the complete list of the servers that I would like searched I can speed up my time.