Java créer un point d'accès wifi dans Windows 8


J'ai besoin de créer un hotspot wifi et un serveur DHCP dans Windows 7-8 avec Java. Je développe un logiciel qui pourrait être pour l'utilisateur moins intrusif et simple que je pourrais.

Pour la première partie de mon travail, j'ai pensé utiliser netsh pour créer le réseau hébergé et pour définir statique l'ip.

Mon code actuel est le suivant:

String[] command = {  "cmd", };
Process p = Runtime.getRuntime().exec(command);
new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());

//now I use the stdin.println for my shell commands

stdin.println("netsh wlan set hostednetwork mode=allow ssid=mynetwork key=mypassword");
stdin.println("netsh wlan start hostednetwork");
stdin.println("netsh interface ipv4 set address \"Wi-Fi\" static 192.168.1.2 255.255.255.0 192.168.1.254");

Problèmes:

1) Je dois élever les privilèges à administrateur. J'ai essayé d'utiliser "élever.EXE" http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line / (trouvé dans une autre question stackoverflow) cela fonctionne bien, mais si j'ai trois appels, il me demande trois fois d'exécuter la commande avec des privilèges d'administrateur..et ce n'est pas très convivial.

J'ai aussi essayé d'utiliser "runas":

runas /noprofile /user:administrator netsh ......

Mais dans ce cas, le problème est que: l'utilisateur administrateur doit être actif sinon je dois trouver un moyen d'analyser tous les utilisateurs actifs avec administration autorisation. Dans la dépendance après les runas, je dois interagir avec l'invite et écrire le mot de passe.

2) Il existe un moyen de scanner toutes les interfaces wifi pour la dernière commande netsh?

Author: Danilo, 2013-08-21

1 answers

Je faisais des recherches un peu sur l'outil elevate et j'ai fait quelques tests. Voici la clé pour le faire fonctionner (à partir de la documentation):

Usage: Elevate [-?|-wait|-k] prog [args]

-k    - Starts the the %comspec% environment variable value and
        executes prog in it (CMD.EXE, 4NT.EXE, etc.)

prog  - The program to execute

J'ai téléchargé l'exécutable elevate.exe et l'ai mis dans mon dossier de projet NetBeans. Ensuite, je crée un seul processus pour chaque commande netsh que vous souhaitez exécuter (j'ai fait quelques modifications mais uniquement à des fins de test).

Avertissement : Testé sur Windows 7 Home, pas Windows 8.

Enfin, comme @ damryfbfnetsi souligné, dans son commentaire, vous devez utiliser ProcessBuilder au lieu de Runtime comme suit:

public static void main(String[] args) {        
    try {

        System.out.println("-- Setting up WLAN --");
        String netshCommand = "netsh wlan set hostednetwork mode=allow ssid=\"YourSSID\" key=\"YourPassword\" & exit";
        String[] elevateCommand = new String[]{"./Release/elevate.exe", "-wait", "-k", "prog", netshCommand};
        ProcessBuilder pb1 = new ProcessBuilder(elevateCommand);
        Process p1 = pb1.start();
        p1.waitFor();

        System.out.println("-- Starting WLAN --");
        netshCommand = "netsh wlan start hostednetwork & exit";
        elevateCommand = new String[]{"./Release/elevate.exe", "-wait", "-k", "prog", netshCommand};
        ProcessBuilder pb2 = new ProcessBuilder(elevateCommand);
        Process p2 = pb2.start();
        p2.waitFor();

        System.out.println("-- Setting up IPv4 interface --");
        netshCommand = "netsh interface ipv4 set address \"Conexión de red inalámbrica\" static 192.168.0.102 255.255.255.0 192.168.0.254 & exit";
        elevateCommand = new String[]{"./Release/elevate.exe", "-wait", "-k", "prog", netshCommand};
        ProcessBuilder pb3 = new ProcessBuilder(elevateCommand);
        Process p3 = pb3.start();
        p3.waitFor();

        System.out.println("-- Getting IPv4 interface dump --");
        netshCommand = "netsh interface ipv4 dump";
        ProcessBuilder pb4 = new ProcessBuilder("cmd.exe", "/c", netshCommand);
        Process p4 = pb4.start();

        System.out.println("-- Printing IPv4 interface dump --");
        BufferedReader bfr = new BufferedReader(new InputStreamReader(p4.getInputStream(),"ISO-8859-1"));
        String output;
        while((output = bfr.readLine()) != null){
            System.out.println(output);
        }

    } catch (IOException | InterruptedException ex) {
        ex.printStackTrace();
    }

}

Remarque : veuillez noter que netshCommand se termine par & exit. En effet, si ce n'est pas le cas, la console cmd ouverte par elevate.exe restera ouverte.

La sortie devrait ressembler à ceci (désolé pour les mots espagnols mais j'ai mes fenêtres dans cette langue):

-- Setting up WLAN --
-- Starting WLAN --
-- Setting up IPv4 interface --
-- Getting IPv4 interface dump --
-- Printing IPv4 interface dump --

#----------------------------------
# Configuración de IPv4
#----------------------------------
pushd interface ipv4

reset set global icmpredirects=enabled
add route prefix=0.0.0.0/0
interface="Conexión de red inalámbrica" nexthop=192.168.0.254 metric=1 publish=Sí 
add address name="Conexión de red inalámbrica" address=192.168.0.102 mask=255.255.255.0

popd
# Fin de la configuración de IPv4
 0
Author: dic19, 2017-05-23 12:28:15