WLAN Profiles Manager

Post tutorials and script examples in this forum.
Forum rules
We have no special rules for UVK forums. Just try to be polite and clear in your posts.
Please don't post spam in this forum. Spammers will be banned by IP, e-mail and username.
We reserve the right to delete all posts and ban all users we consider not having respected these rules without warning.
Post Reply
Fred
Site Admin
Posts: 2357
Joined: Sat Jul 30, 2011 12:05 pm
Location: Red coast, France
Contact:

WLAN Profiles Manager

Post by Fred »

This UVK script is a simple program that allows to perform WIFI related actions that have been
removed from the Windows 8/8.1 interface, such as deleting saved WIFI profiles.

This program can be easily extended to a full WIFI manager.

Download:
WLANProfilesManager.uvk
(12.14 KiB) Downloaded 606 times
Full code:

Code: Select all

<UVKCommandsScript>
 <AutoItScript>
#RequireAdmin
#cs
WLAN Profiles Manager

Author: Fred (www.carifred.com)

This is a simple program that allows to perform WIFI related actions that have been
removed from the Windows 8/8.1 interface, such as deleting saved WIFI profiles.
This program can be easily extended to a full WIFI manager.
#ce

#Region Global constants
Global Const $h__WLANAPI = DllOpen('Wlanapi.dll')
Global Const $WLAN_CLIENT_VERSION = StringInStr('WIN_XP WIN_XPe WIN_2003',@OSVersion) ? 1 : 2
Global Const $tWLAN_INFO_LIST = 'DWORD;DWORD'
Global Const $tGUID = 'DWORD Data1;WORD Data2;WORD Data3;BYTE Data4[8]'
Global Const $tWLAN_INTERFACE_INFO = 'struct;'&$tGUID&';endstruct;WCHAR Description[256];LONG isState'
Global Const $tWLAN_PROFILE_INFO = 'WCHAR ProfileName[256];DWORD dwFlags'

Global Const $tagLVITEM = 'UINT mask;int iItem;int iSubItem;UINT state;UINT stateMask;ptr pszText;'& _
'int cchTextMax;int iImage;LPARAM lParam;int iIndent;int iGroupId;UINT cColumns;UINT puColumns; int piColFmt;int iGroup'
Global Const $LVM_GETITEMTEXT		= 0x1000 + 115
Global Const $LVM_GETNEXTITEM		= 0x1000 + 12
Global Const $LVM_SETCOLLUMNWIDTH	= 0x1000 + 30
Global Const $LVM_DELETEALLITEMS	= 0x1000 + 9
Global Const $LVM_DELETEITEM		= 0x1000 + 8
Global Const $LVM_GETITEMCOUNT		= 0x1000 + 4

Global Const $GUI_SHOW = 16
Global Const $GUI_HIDE = 32
Global Const $GUI_ENABLE = 64
Global Const $GUI_DISABLE = 128

Global Const $CB_GETCURSEL = 0x147
Global Const $CB_GETDROPPEDSTATE = 0x157

#EndRegion Global constants

#Region Application Core
Global $hClient = _WlanOpenHandle()
Global $ExitVal = _Main()
_WlanCloseHandle($hClient)
Exit $ExitVal

Func _Main()
	Local $aInterfaces = _WlanGetInterfaces($hClient)
	If @error Or $aInterfaces[0][0] = 0 Then
		MsgBox(16,'No WLAN Interfaces', 'No WLAN interfaces found.')
		Return 1
	EndIf
	Local $hwnd = GUICreate('WLAN Profiles Manager',600, 500)
	GUISetFont(9)
	GUICtrlCreateLabel('WLAN profiles manager lists the available Wifi profiles in the local computer.'&@CRLF& _
	'It allows to connect/disconnet and delete the listed profiles.',20,20)
	GUICtrlCreateLabel('Please select an inteface:',20,80)
	Local $intCombo = GUICtrlCreateCombo('',180,76,380,-1,3)
	For $i = 1 To $aInterfaces[0][0]
		GUICtrlSetData(-1,$aInterfaces[$i][1],$aInterfaces[1][1])
	Next
	Local $Msg, $aButton[6], $combosel = 0, $pcombosel = 0, $lvsel = -1, $plvsel = -1
	Local $clabel = GUICtrlCreateLabel('No profiles found for the selected interface.', 220, 180,340,20,1)
	Local $listview = GUICtrlCreateListView('  Profile name|  Type', 200,120, 380,360)
	GUICtrlSendMsg(-1,$LVM_SETCOLLUMNWIDTH,0,190)
	GUICtrlSendMsg(-1,$LVM_SETCOLLUMNWIDTH,1,160)
	Local $aProfiles = _ListWlanProfiles($listview, $clabel, $aInterfaces[1][0])
	$aButton[0] = GUICtrlCreateButton('Disconnect', 20,140,160,25)
	$aButton[1] = GUICtrlCreateButton('Connect selected', 20,190,160,25)
	$aButton[2] = GUICtrlCreateButton('Delete selected', 20,240,160,25)
	$aButton[3] = GUICtrlCreateButton('Delete all', 20,290,160,25)
	$aButton[4] = GUICtrlCreateButton('Refresh', 20,340,160,25)
	$aButton[5] = GUICtrlCreateButton('Exit', 20,390,160,25)
	GUICtrlSetState($aButton[1], $GUI_DISABLE)
	GUICtrlSetState($aButton[2], $GUI_DISABLE)
	GUICtrlSetState($aButton[0], $GUI_DISABLE)
	Local $ProfileName, $state, $count, $connected = 0
	If $aInterfaces[1][2] = 1 Then
		GUICtrlSetState($aButton[0], $GUI_ENABLE)
		$connected = 1
	EndIf
	If $aProfiles[0][0] = 0 Then GUICtrlSetState($aButton[3], $GUI_DISABLE)
	GUISetState()
	While 1
		$lvsel = GUICtrlSendMsg($listview, $LVM_GETNEXTITEM, -1, 2)
		If $lvsel <> $plvsel Then
			If $lvsel >= 0 And $plvsel >= 0 Then
				$plvsel = $lvsel
				ContinueLoop
			EndIf
			$state = ($lvsel < 0) ? $GUI_DISABLE : $GUI_ENABLE
			GUICtrlSetState($aButton[1], $state)
			GUICtrlSetState($aButton[2], $state)
			$plvsel = $lvsel
		EndIf
		$Msg = GUIGetMsg()
		Switch $Msg
			Case $intCombo ; Change interface
				If GUICtrlSendMsg($intCombo,$CB_GETDROPPEDSTATE,0,0) Then ContinueLoop
				$combosel = Int(GUICtrlSendMsg($intCombo,$CB_GETCURSEL,0,0),1)
				If $combosel <> $pcombosel Then
					$aProfiles = _ListWlanProfiles($listview, $clabel, $aInterfaces[$combosel+1][0])
					$pcombosel = $combosel
					$state = ($combosel+1 = $connected) ? $GUI_ENABLE : $GUI_DISABLE
					GUICtrlSetState($aButton[0], $state)
					$state = $aProfiles[0][0] ? $GUI_ENABLE : $GUI_DISABLE
					GUICtrlSetState($aButton[3], $state)
				EndIf
			Case $aButton[0] ; Disconnect selected
				_WlanDisconnect($hClient,$aInterfaces[$combosel+1][0])
				GUICtrlSetState($aButton[0], $GUI_DISABLE)
				$connected = 0
			Case $aButton[1] ; Connect selected
				If $lvsel < 0 Then ContinueLoop
				$ProfileName = _LvGetItemText($listview,$lvsel)
				If _WlanConnect($hClient,$aInterfaces[$combosel+1][0],$ProfileName) Then
					GUICtrlSetState($aButton[0], $GUI_ENABLE)
					$connected = $combosel+1
				EndIf
			Case $aButton[2] ; Delete selected
				If $lvsel < 0 Then ContinueLoop
				If MsgBox(52, 'Delete selected profile', _
				'Are you sure you want to delete the selected profile?',0,$hwnd) = 7 Then ContinueLoop
				$ProfileName = _LvGetItemText($listview,$lvsel)
				If _WlanDeleteProfile($hClient,$aInterfaces[$combosel+1][0],$ProfileName) Then _
				GUICtrlSendMsg($listview, $LVM_DELETEITEM, $lvsel, 0)
				_ListWlanProfiles($listview, $clabel, $aInterfaces[$combosel+1][0])
			Case $aButton[3] ; Delete all
				$count = GUICtrlSendMsg($listview, $LVM_GETITEMCOUNT,0,0)
				If $count = 0 Then ContinueLoop
				If MsgBox(52, 'Delete all profiles', _
				'Are you sure you want to delete the saved profiles belongint to this interface?', _
				0,$hwnd) = 7 Then ContinueLoop
				For $i = $count -1 To 0 Step -1
					$ProfileName = _LvGetItemText($listview,$i)
					If _WlanDeleteProfile($hClient,$aInterfaces[$combosel+1][0],$ProfileName) Then _
					GUICtrlSendMsg($listview, $LVM_DELETEITEM, $i, 0)
				Next
				GUICtrlSetState($aButton[3], $GUI_DISABLE)
				_ListWlanProfiles($listview, $clabel, $aInterfaces[$combosel+1][0])
			Case $aButton[4]
				GUIDelete()
				Return _Main()
			Case -3, $aButton[5]
				Return 0
		EndSwitch
	WEnd
EndFunc ;==> _Main

#EndRegion Application core

#region Functions
Func _LvGetItemText($lvId, $item, $subitem = 0)
	Local $sLVITEM = DllStructCreate($tagLVITEM)
	DllStructSetData($sLVITEM, 'mask', 1)
	DllStructSetData($sLVITEM, 'iSubItem', $subitem)
	DllStructSetData($sLVITEM, 'cchTextMax', 1024)
	Local $sText = DllStructCreate('WCHAR[1024]')
	DllStructSetData($sLVITEM, 'pszText', DllStructGetPtr($sText))
	GUICtrlSendMsg($lvId, $LVM_GETITEMTEXT, $item, DllStructGetPtr($sLVITEM))
	Return DllStructGetData($sText,1)
EndFunc ;==> _LvGetItemText

Func _ListWlanProfiles($listview, $clabel, $interface)
	Local $aProfiles = _WlanGetProfiles($hClient, $interface)
	If $aProfiles[0][0] = 0 Then
		GUICtrlSetState($listview, $GUI_HIDE)
		GUICtrlSetState($clabel, $GUI_SHOW)
	Else
		GUICtrlSetState($clabel, $GUI_HIDE)
		GUICtrlSendMsg($listview,$LVM_DELETEALLITEMS,0,0)
		For $i = 1 To $aProfiles[0][0]
			GUICtrlCreateListViewItem($aProfiles[$i][0]&'|'& _
			_ProfileTypeStr($aProfiles[$i][1]),$listview)
		Next
		GUICtrlSetState($listview, $GUI_SHOW)
	EndIf
	Return $aProfiles
EndFunc ;==> _ListWlanProfiles

Func _ProfileTypeStr($state)
	Switch $state
		Case 0
			Return 'Wifi profile'
		Case 1
			Return 'Group policy Wifi profile'
		Case 2
			Return 'User Wifi profile'
	EndSwitch
	Return 'Unknown Wifi profile'
EndFunc ;==> _ProfileTypeStr

Func _WlanGetInterfaces($hClientHandle)
	Local $aRet[1][3] = [[0]]
	If $hClientHandle = 0 Then Return SetError(1,0,$aRet)
	Local $pItf = _WlanEnumInterfaces($hClientHandle)
	If @error Then Return SetError(1,0,$aRet)
	Local $wlinfo = DllStructCreate($tWLAN_INFO_LIST,$pItf)
	Local $Total = DllStructGetData($wlinfo,1)
	If $Total = 0 Then Return $aRet
	Local $vPtr = $pItf + DllStructGetSize($wlinfo), $sIntInfo
	ReDim $aRet[$Total+1][3]
	For $i = 1 To $Total
		$sIntInfo = DllStructCreate($tWLAN_INTERFACE_INFO, $vPtr)
		$aRet[$i][0] = DllStructCreate($tGUID)
		_CopyStruct($sIntInfo, $aRet[$i][0], 4)
		$aRet[$i][1] = DllStructGetData($sIntInfo, 'Description')
		$aRet[$i][2] = DllStructGetData($sIntInfo, 'isState')
		$vPtr += DllStructGetSize($sIntInfo)
	Next
	$aRet[0][0] = $Total
	_WlanFreeMemory($pItf)
	Return $aRet
EndFunc ;==> _WlanGetInterfaces

Func _WlanGetProfiles($hClientHandle, $sGUid)
	Local $aRet[1][2] = [[0]]
	Local $pItf = _WlanGetProfileList($hClientHandle, $sGUid)
	If @error Then Return SetError(1,0,$aRet)
	Local $wlinfo = DllStructCreate($tWLAN_INFO_LIST,$pItf)
	Local $Total = DllStructGetData($wlinfo,1)
	If $Total = 0 Then Return $aRet
	Local $vPtr = $pItf + DllStructGetSize($wlinfo), $sProfInfo
	ReDim $aRet[$Total+1][2]
	For $i = 1 To $Total
		$sProfInfo = DllStructCreate($tWLAN_PROFILE_INFO, $vPtr)
		$aRet[$i][0] = DllStructGetData($sProfInfo, 'ProfileName')
		$aRet[$i][1] = DllStructGetData($sProfInfo, 'dwFlags')
		$vPtr += DllStructGetSize($sProfInfo)
	Next
	$aRet[0][0] = $Total
	_WlanFreeMemory($pItf)
	Return $aRet
EndFunc ;==> _WlanGetProfiles

Func _CopyStruct($sSrc, $sDst, $Elems = 1)
	If Not IsDllStruct($sSrc) Or Not IsDllStruct($sDst) Then Return SetError(1,0,0)
	For $i = 1 To $Elems
		DllStructSetData($sDst,$i,DllStructGetData($sSrc, $i))
	Next
	Return 1
EndFunc ;==> _CopyStruct

Func _WlanOpenHandle()
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanOpenHandle', _
	'DWORD',$WLAN_CLIENT_VERSION, 'ptr',0, 'DWORD*',0, 'HANDLE*',0)
	If Not @error Then Return SetExtended($aCall[3],$aCall[4])
EndFunc ;==> _WlanOpenHandle

Func _WlanCloseHandle($hClientHandle)
	If $hClientHandle = 0 Then Return SetError(1,0,0)
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanCloseHandle', _
	'HANDLE',$hClientHandle, 'ptr',0)
	If Not @error Then Return Number($aCall[0] = 0)
EndFunc ;==> _WlanCloseHandle

Func _WlanEnumInterfaces($hClientHandle)
	If $hClientHandle = 0 Then Return SetError(1,0,0)
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanEnumInterfaces', _
	'HANDLE',$hClientHandle, 'ptr',0, 'ptr*',0)
	If Not @error And $aCall[0] = 0 Then Return $aCall[3]
	Return SetError(1,0,0)
EndFunc ;==> _WlanEnumInterfaces

Func _WlanGetProfileList($hClientHandle, $sGUid)
	Local $pGuid = IsDllStruct($sGUid) ? DllStructGetPtr($sGUid) : $sGUid
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanGetProfileList', _
	'HANDLE',$hClientHandle, 'ptr',$pGuid, 'ptr',0, 'ptr*',0)
	If Not @error And $aCall[0] = 0 Then Return $aCall[4]
	Return SetError(1,0,0)
EndFunc ;==> _WlanGetProfileList

Func _WlanFreeMemory($pmem)
	If $pmem = 0 Then Return SetError(1,0,0)
	DllCall($h__WLANAPI, 'none','WlanFreeMemory', 'ptr',$pmem)
	Return 1
EndFunc ;==> _WlanFreeMemory

Func _WlanDeleteProfile($hClientHandle, $sGUid, $ProfileName)
	Local $pGuid = IsDllStruct($sGUid) ? DllStructGetPtr($sGUid) : $sGUid
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanDeleteProfile', _
	'HANDLE',$hClientHandle, 'ptr',$pGuid, 'wstr',$ProfileName, 'ptr',0)
	If Not @error Then Return Number($aCall[0] = 0)
EndFunc ;==> _WlanDeleteProfile

Func _WlanConnect($hClientHandle, $sGUid, $ProfileName)
	Local $pGuid = IsDllStruct($sGUid) ? DllStructGetPtr($sGUid) : $sGUid
	Local $sProfile = DllStructCreate('WCHAR['&StringLen($ProfileName)+1&']')
	DllStructSetData($sProfile, 1,$ProfileName)
	Local $sConnParams = DllStructCreate('LONG wlanConnectionMode;'& _
	'ptr strProfile;ptr 0;ptr 0;LONG BssType;DWORD dwFlags')
	DllStructSetData($sConnParams, 'strProfile', DllStructGetPtr($sProfile,1))
	DllStructSetData($sConnParams, 'BssType', 3)
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanConnect', _
	'HANDLE',$hClientHandle, 'ptr',$pGuid, 'struct*',$sConnParams, 'ptr',0)
	If Not @error And $aCall[0] = 0 Then Return 1
	Return SetError(1,0,0)
EndFunc ;==> _WlanConnect

Func _WlanDisconnect($hClientHandle, $sGUid)
	Local $pGuid = IsDllStruct($sGUid) ? DllStructGetPtr($sGUid) : $sGUid
	Local $aCall = DllCall($h__WLANAPI, 'DWORD','WlanDisconnect', _
	'HANDLE',$hClientHandle, 'ptr',$pGuid, 'ptr',0)
	If Not @error And $aCall[0] = 0 Then Return 1
	Return SetError(1,0,0)
EndFunc ;==> _WlanDisconnect
#EndRegion Functions
Enjoy, and Merry Christmas!
One thing we humans have in common is that we are all different. So, if you think you're weird because you're different from everyone else, then we are all weird.

Fred
FredJClaus
Posts: 323
Joined: Sat Dec 06, 2014 6:21 am

Re: WLAN Profiles Manager

Post by FredJClaus »

Thanks Fred. As soon as I'm back on my computer I will download this and try to install. Will this work for windows 7 as well or is this based on bills post about win8 specifically?
Morronicrepair
Posts: 3
Joined: Tue Mar 31, 2015 9:33 pm

Re: WLAN Profiles Manager

Post by Morronicrepair »

Very cool! I should really start looking on here first for scripts like these before I build my own tools :p
Charger440
Posts: 1529
Joined: Sun May 25, 2014 7:44 am
Location: Missouri

Re: WLAN Profiles Manager

Post by Charger440 »

Morronicrepair, you do pretty much anything you want with UVKs built-in scripting abilities. I personally don't know of a competitor that can say that. You can literally write an entire "program" to run inside UVK. Not sure why you would want to, but you could :)

Jim
Jim

It is not "Can it be done?" but rather, "How can we do it?"
Charger440
Posts: 1529
Joined: Sun May 25, 2014 7:44 am
Location: Missouri

Re: WLAN Profiles Manager

Post by Charger440 »

Fred,

Just FYI. I downloaded this script and line 249 has an error then 250 after that is fixed.... Might look in to that sometime.
Jim

It is not "Can it be done?" but rather, "How can we do it?"
Fred
Site Admin
Posts: 2357
Joined: Sat Jul 30, 2011 12:05 pm
Location: Red coast, France
Contact:

Re: WLAN Profiles Manager

Post by Fred »

Thanks, Jim. Actually this script is fine. There's just a bug in the new beta that needs to be fixed.
One thing we humans have in common is that we are all different. So, if you think you're weird because you're different from everyone else, then we are all weird.

Fred
Charger440
Posts: 1529
Joined: Sun May 25, 2014 7:44 am
Location: Missouri

Re: WLAN Profiles Manager

Post by Charger440 »

LOL ok then :)

In that case, I found another bug for you :)

:lol:
Jim

It is not "Can it be done?" but rather, "How can we do it?"
Post Reply