Forcer l'actualisation (nouvelle analyse) des réseaux sans fil à partir de la ligne de commande?

14

Comment puis-je forcer Windows à effectuer une nouvelle analyse des réseaux sans fil disponibles à partir de la ligne de commande?

(Par exemple, je recherche l'équivalent en ligne de commande de l'appui sur F5 sur l'interface graphique.)

Mehrdad
la source
Taper la commande et appuyer sur la touche haut + entrée ne fonctionnent pas ou utilisez-vous cette commande dans le cadre d'une commande plus grande?
cutrightjm
1
@ekaj: en tapant "la commande"? Quelle commande?
Mehrdad
netsh wlan montrer les réseaux ... add mode = bssid à la fin pour afficher les canaux, les types de cryptage et les taux
cutrightjm
3
@ekaj: Cela n'actualise rien, il montre seulement les données mises en cache.
Mehrdad

Réponses:

9

Je cherche la même chose depuis un moment maintenant, malheureusement, rien ne semble pouvoir être trouvé dans l'utilitaire netsh. La meilleure solution que j'ai pu trouver était de désactiver puis de réactiver l'interface via les commandes netsh. Il y a un petit délai (1-2 secondes) après l'activation de l'interface où aucune liste de réseaux n'est répertoriée, mais cela ne devrait pas être trop difficile à éviter.

J'utilise les commandes suivantes:

netsh interface set interface name="<NIC name>" admin=disabled
netsh interface set interface name="<NIC name>" admin=enabled
netsh wlan show networks

Edit: Comment obtenir alors le "<NIC name>"nom de la carte d’interface réseau, c’est-à-dire.

Tout d'abord utiliser la commande netsh wlan show networks

Si le wlan est activé, vous recevrez un message comme celui-ci

C:\Users\user1>netsh wlan show networks

Interface name : WiFi
There are 2 networks currently visible.

SSID 1 : Cross
    Network type            : Infrastructure
    Authentication          : WPA2-Personal
    Encryption              : CCMP

SSID 2 : WLAN-0A8E41
    Network type            : Infrastructure
    Authentication          : WPA2-Personal
    Encryption              : CCMP

Donc, vous voyez, dans ce cas, le nom de l' interface est WiFi Maintenant, vous pouvez procéder comme expliqué ci-dessus, par exemple pour désactiver la carte wlan:

netsh interface set interface name="WiFi" admin=disabled

Etc. :)

Greg
la source
3

Les réseaux ne sont mis à jour que lorsqu'une analyse est effectuée par votre carte WiFi . La NETSHcommande ne demande pas d'analyse. il affiche uniquement les résultats mis en cache de la dernière analyse.

L'ouverture de la liste de réseaux Windows à partir de la barre des tâches met à jour les résultats, car l'outil réseau de la barre des tâches demande une analyse à son ouverture.

Il n'y a pas de NETSHcommande pour demander une analyse comme celle-ci. Vous devez écrire du code en exploitant la fonction Win32 WlanScan (des wrappers C # existent si vous préférez) ou la fonction WinRT ScanAsync .

(Adapté / mis à jour à partir de la source .)


Apparenté, relié, connexe:

ashleedawg
la source
2

J'ai écrit un petit programme (~ 2 Ko) WlanScan.exepour le faire.

Voici le base64 (version 32 bits):

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

Vous pouvez l'enregistrer dans un fichier de PowerShell comme ceci (enregistrez d' WlanScan.txtabord le Base64 ):

Set-Content -Path "WlanScan.exe" $([Convert]::FromBase64String($(Get-Content -Path "WlanScan.txt"))) -Encoding Byte

Voici le code source:

#include <tchar.h>
#include <Windows.h>

#ifndef __CRT_STRINGIZE
#define __CRT_STRINGIZE(Value) #Value
#endif
#ifndef _CRT_STRINGIZE
#define _CRT_STRINGIZE(Value) __CRT_STRINGIZE(Value)
#endif

enum { WLAN_NOTIFICATION_SOURCE_ACM = 0x00000008 };
typedef enum _WLAN_NOTIFICATION_ACM { wlan_notification_acm_start, wlan_notification_acm_autoconf_enabled, wlan_notification_acm_autoconf_disabled, wlan_notification_acm_background_scan_enabled, wlan_notification_acm_background_scan_disabled, wlan_notification_acm_bss_type_change, wlan_notification_acm_power_setting_change, wlan_notification_acm_scan_complete, wlan_notification_acm_scan_fail, wlan_notification_acm_connection_start, wlan_notification_acm_connection_complete, wlan_notification_acm_connection_attempt_fail, wlan_notification_acm_filter_list_change, wlan_notification_acm_interface_arrival, wlan_notification_acm_interface_removal, wlan_notification_acm_profile_change, wlan_notification_acm_profile_name_change, wlan_notification_acm_profiles_exhausted, wlan_notification_acm_network_not_available, wlan_notification_acm_network_available, wlan_notification_acm_disconnecting, wlan_notification_acm_disconnected, wlan_notification_acm_adhoc_network_state_change, wlan_notification_acm_profile_unblocked, wlan_notification_acm_screen_power_change, wlan_notification_acm_profile_blocked, wlan_notification_acm_scan_list_refresh, wlan_notification_acm_end } WLAN_NOTIFICATION_ACM, *PWLAN_NOTIFICATION_ACM;
typedef enum _WLAN_INTERFACE_STATE { wlan_interface_state_not_ready, wlan_interface_state_connected, wlan_interface_state_ad_hoc_network_formed, wlan_interface_state_disconnecting, wlan_interface_state_disconnected, wlan_interface_state_associating, wlan_interface_state_discovering, wlan_interface_state_authenticating } WLAN_INTERFACE_STATE, *PWLAN_INTERFACE_STATE;
typedef struct _WLAN_INTERFACE_INFO { GUID InterfaceGuid; WCHAR strInterfaceDescription[256]; WLAN_INTERFACE_STATE isState; } WLAN_INTERFACE_INFO;
typedef struct _WLAN_INTERFACE_INFO_LIST { DWORD dwNumberOfItems; DWORD dwIndex; WLAN_INTERFACE_INFO InterfaceInfo[1]; } WLAN_INTERFACE_INFO_LIST;
typedef struct _WLAN_NOTIFICATION_DATA { DWORD NotificationSource; DWORD NotificationCode; GUID InterfaceGuid; DWORD dwDataSize; void *pData; } WLAN_NOTIFICATION_DATA, *PWLAN_NOTIFICATION_DATA;
typedef void WINAPI WLAN_NOTIFICATION_CALLBACK(WLAN_NOTIFICATION_DATA *, void *);

typedef struct wlan_scan_finished_context { WLAN_INTERFACE_INFO_LIST *interface_list; HANDLE semaphore; } wlan_scan_finished_context;
static void WINAPI wlan_notification_callback(WLAN_NOTIFICATION_DATA *data, void *context)
{
    if ((data->NotificationSource | WLAN_NOTIFICATION_SOURCE_ACM) == WLAN_NOTIFICATION_SOURCE_ACM)
    {
        if (data->NotificationCode == wlan_notification_acm_power_setting_change || data->NotificationCode == wlan_notification_acm_scan_complete)
        {
            wlan_scan_finished_context *const ctx = (wlan_scan_finished_context *)context;
            if (ctx)
            {
                for (unsigned int i = 0; i != (ctx->interface_list ? ctx->interface_list->dwNumberOfItems : 0); ++i)
                {
                    if (memcmp(&ctx->interface_list->InterfaceInfo[i].InterfaceGuid, &data->InterfaceGuid, sizeof(data->InterfaceGuid)) == 0)
                    {
                        ctx->interface_list->InterfaceInfo[i].isState = (WLAN_INTERFACE_STATE)(ctx->interface_list->InterfaceInfo[i].isState | (data->NotificationCode << 16));
                    }
                }
                if (ctx->semaphore) { long prev; ReleaseSemaphore(ctx->semaphore, 1, &prev); }
            }
        }
    }
}

int _tmain(int argc, TCHAR *argv[])
{
    (void)argv;
    unsigned int result;
    if (argc > 1) { result = ERROR_INVALID_PARAMETER; }
    else
    {
        HMODULE const wlanapi = LoadLibrary(TEXT("wlanapi.dll"));
        if (wlanapi)
        {
#define X(Module, Return, Name, Params) typedef Return Name##_t Params; Name##_t *Name = (Name##_t *)GetProcAddress(Module, __CRT_STRINGIZE(Name));
            X(wlanapi, DWORD WINAPI, WlanCloseHandle, (HANDLE hClientHandle, void *pReserved));
            X(wlanapi, DWORD WINAPI, WlanEnumInterfaces, (HANDLE hClientHandle, void *pReserved, struct _WLAN_INTERFACE_INFO_LIST **ppInterfaceList));
            X(wlanapi, void WINAPI, WlanFreeMemory, (void *pMemory));
            X(wlanapi, DWORD WINAPI, WlanOpenHandle, (DWORD dwClientVersion, void *pReserved, DWORD *pdwNegotiatedVersion, HANDLE *phClientHandle));
            X(wlanapi, DWORD WINAPI, WlanRegisterNotification, (HANDLE hClientHandle, DWORD dwNotifSource, BOOL bIgnoreDuplicate, WLAN_NOTIFICATION_CALLBACK funcCallback, void *pCallbackContext, void *pReserved, DWORD *pdwPrevNotifSource));
            X(wlanapi, DWORD WINAPI, WlanScan, (HANDLE hClientHandle, const GUID *pInterfaceGuid, const struct _DOT11_SSID *pDot11Ssid, const struct _WLAN_RAW_DATA *pIeData, void *pReserved));
#undef X
            DWORD version;
            HANDLE handle = NULL;
            result = WlanOpenHandle ? WlanOpenHandle(1, NULL, &version, &handle) : ERROR_PROC_NOT_FOUND;
            if (result == ERROR_SUCCESS)
            {
                WLAN_INTERFACE_INFO_LIST *interface_list = NULL;
                result = WlanEnumInterfaces ? WlanEnumInterfaces(handle, NULL, &interface_list) : ERROR_PROC_NOT_FOUND;
                if (result == ERROR_SUCCESS)
                {
                    wlan_scan_finished_context context = { interface_list, CreateSemaphore(NULL, 0, (LONG)interface_list->dwNumberOfItems, NULL) };
                    DWORD prev;
                    unsigned int nwait = 0;
                    unsigned long const register_notification_result = WlanRegisterNotification ? WlanRegisterNotification(handle, WLAN_NOTIFICATION_SOURCE_ACM, FALSE, wlan_notification_callback, &context, NULL, &prev) : ERROR_PROC_NOT_FOUND;
                    for (unsigned int i = 0; i != interface_list->dwNumberOfItems; ++i)
                    {
                        unsigned int const result_i = WlanScan ? WlanScan(handle, &interface_list->InterfaceInfo[i].InterfaceGuid, NULL, NULL, NULL) : ERROR_PROC_NOT_FOUND;
                        interface_list->InterfaceInfo[i].isState = (WLAN_INTERFACE_STATE)(interface_list->InterfaceInfo[i].isState & 0xFFFF);
                        if (result_i == ERROR_SUCCESS) { ++nwait; }
                        else { interface_list->InterfaceInfo[i].isState = (WLAN_INTERFACE_STATE)(interface_list->InterfaceInfo[i].isState | (result_i << 16)); }
                    }
                    while (nwait > 0)
                    {
                        WaitForSingleObject(context.semaphore, INFINITE);
                        --nwait;
                    }
                    for (unsigned int i = 0; i != interface_list->dwNumberOfItems; ++i)
                    {
                        unsigned int const result_i = interface_list->InterfaceInfo[i].isState >> 16;
                        if (register_notification_result == ERROR_SUCCESS && result_i != ERROR_SUCCESS)
                        { result = result_i; }
                    }
                    if (result == ERROR_SUCCESS && register_notification_result != ERROR_SUCCESS) { result = ERROR_IO_PENDING; }
                    if (context.semaphore) { CloseHandle(context.semaphore); }
                    WlanFreeMemory ? WlanFreeMemory(interface_list) : ERROR_PROC_NOT_FOUND;
                }
                WlanCloseHandle ? WlanCloseHandle(handle, NULL) : ERROR_PROC_NOT_FOUND;
            }
        }
        else { result = (unsigned int)GetLastError(); }
    }
    return (int)result;
}
Mehrdad
la source
Je ne peux pas croire que personne n'avait même voté pour cette réponse! Oui, il nécessite un compilateur C ++, comme Community Edition gratuit de Visual Studio 2015. Mais il a compilé sans accroc et fait exactement ce que le PO a demandé. Bravo Mehrdad!
Gabe Halsmer le
@GabeHalsmer: Merci! Il fait exactement ce que le PO a demandé parce que ... je suis le PO;) Je ne l'ai posté que il y a 2-3 semaines, alors je suppose que personne ne l'a encore vu.
Mehrdad le
Je vois que vous avez joint le codage Base64 du code binaire. Puis-je vous demander comment créer le fichier exécutable sous Windows en enregistrant ce code Base64? Puis-je le faire depuis un terminal, en utilisant par exemple PowerShell? Ou suggérez-vous un éditeur spécial pour le faire?
Kubuntuer82
1
@ Kubuntuer82: à partir de PowerShell, vous pouvez le faire Set-Content -Path "WlanScan.exe" $([Convert]::FromBase64String($(Get-Content -Path "WlanScan.txt"))) -Encoding Byte. A partir de l' extérieur PowerShell, vous pouvez également utiliser des tuyaux pour appeler PowerShell si c'est plus facile: powershell -command "$b = [Convert]::FromBase64String([Console]::In.ReadToEnd()); $s = [Console]::OpenStandardOutput(); try { $s.Write($b, 0, $b.Length); } finally { $s.Close(); }" < WlanScan.txt > WLANScan.exe. Je vais l'ajouter à la réponse.
Mehrdad
Merci beaucoup pour cela :)
Kubuntuer82
0

Pour étendre cette réponse , voici un script de traitement par lots à automatiser:

@ECHO OFF
for /f "tokens=*" %%a in ('netsh wlan show networks ^| grep -oP "Interface\s+name\s*:\s*\K(.*)"') do set "interface_name=%%a"
netsh interface set interface name=%interface_name% admin=disabled
netsh interface set interface name=%interface_name% admin=enabled
netsh wlan show networks

assurez-vous de l'exécuter en tant qu'administrateur .

Nae
la source