-
Notifications
You must be signed in to change notification settings - Fork 5
/
Get-WifiProfile.ps1
117 lines (100 loc) · 4.51 KB
/
Get-WifiProfile.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
function Get-WifiProfile {
<#
.SYNOPSIS
Function to pull stored wifi profiles and security keys.
.DESCRIPTION
Function to pull stored wifi profiles and security keys. Running the function with no parameters will
show all stored wifi profiles with any stored security keys obfuscated.
.EXAMPLE
PS C:\> Get-WifiProfile 'Hilton'
Gets all wifi profiles that contain the word Hilton with passwords obfuscated
.EXAMPLE
PS C:\> Get-WifiProfile 'Hilton' -ShowKey
Gets all wifi profiles that contain the word Hilton with passwords in plain text
.PARAMETER Name
Partial or full name of a wifi network
.PARAMETER Showkey
Switch to choose showing security key in plain text.
.NOTES
https://www.reddit.com/r/PowerShell/comments/tnzyxw/showwifipasswords/
https://github.com/krzydoug/Tools/blob/master/Get-WifiProfile.ps1
#>
[CmdletBinding()]
param (
[Parameter(HelpMessage="Enter the name of the Wifi profile")]
[Alias("SSID","Network")]
[string[]]$Name,
[switch]$ShowKey
)
begin {
# Start by getting a list of all existing profiles
$profiles = netsh wlan show profiles
# Check if wlansvc is not running
if($profiles -match 'wlansvc.+is not running'){
Write-Warning $profiles
break
}
else{
$networklist = @($profiles) -match ' :' -replace '.+: '
}
# Store command as a scriptblock. If $ShowKey is present then key=clear will be added to the command
# Issue encountered with SSID that include single quote. Replace single quote with asterisk in profile lookup
$command = {netsh wlan show profiles $($network -replace "'",'*') ('','key=clear')[$ShowKey.IsPresent]}
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$iselevated = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if($ShowKey -and -not $iselevated){
Write-Warning "'Run as Administrator' is required to decipher security keys"
$ShowKey = $false
}
}
process {
if(-not ($networklist)){
break
}
$lookuplist = if($Name){
# Concantonate all names as a regex or pattern (if only one value no pipe is appended)
$regexlist = $Name -join '|'
# Force array matching even if only one value so any matches are output
@($networklist) -match $regexlist
}
else{
$networklist
}
foreach($network in $lookuplist){
Write-Verbose "Processing network $network"
$ht = [ordered]@{}
# Match only the lines that may have values
(& $command) -match " : .+" | ForEach-Object{
# , is the array operator to send the result of the split as an array instead of one at a time
,($_.Trim() -split '\s+:\s+') | ForEach-Object{
# To maintain the order of properties when $ShowKey is not called add the obfuscated password or N/A right after 'Security Key'
if($_[0] -eq 'Security Key' -and -not $ShowKey){
$ht.'Key Content' = if($_[1] -eq 'present'){
# Password is present and $ShowKey not called so replace password with 6 to 10 asterisks
'*' * (Get-Random (6..10))
}
else{
# Security key is not present
"N/A"
}
}
# If the hashtable already contains the key capture the values
if($entry = $ht[$_[0]]){
# Split on comma even if there are none and check if current value already present
if(($array = $entry -split ',') -notcontains $_[1]){
# Add value to existing values joined with commas
$ht[$_[0]] = @($array) + $_[1] -join ','
}
}
else{
# Key not present in hashtable so create it while setting the value
$ht[$_[0]] = $_[1]
}
}
}
[PSCustomObject]$ht
}
}
end {
}
}