Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在Windows 8中创建wifi热点_Java_Command Line_Wifi_Jvm Hotspot_Netsh - Fatal编程技术网

Java在Windows 8中创建wifi热点

Java在Windows 8中创建wifi热点,java,command-line,wifi,jvm-hotspot,netsh,Java,Command Line,Wifi,Jvm Hotspot,Netsh,我需要用Java在Windows 7-8中创建wifi热点和DHCP服务器。 我正在开发一个软件,可以为用户少干扰和简单,我可以 在我工作的第一部分,我想使用netsh创建托管网络并设置静态ip 我目前的代码是: String[] command = { "cmd", }; Process p = Runtime.getRuntime().exec(command); new Thread(new SyncPipe(p.getErrorStream(), System.err)).start(

我需要用Java在Windows 7-8中创建wifi热点和DHCP服务器。 我正在开发一个软件,可以为用户少干扰和简单,我可以

在我工作的第一部分,我想使用netsh创建托管网络并设置静态ip

我目前的代码是:

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");
问题:

1) 我需要将权限提升到管理员。 我尝试使用“elevate.exe”(在另一个stackoverflow问题中找到)它工作得很好,但是如果我有三个电话,他会让我三次以管理员权限执行命令……这对用户不是很友好

我还尝试使用“符文”:

但在这种情况下,问题是:管理员用户必须是活动的,否则我必须找到一种方法来扫描所有具有管理权限的活动用户。在runas之后,我必须与prompt交互并写入密码


2) 有一种方法可以扫描所有wifi接口以查找最后一个netsh命令?

我对该工具进行了一些研究,并做了一些测试。以下是使其工作的关键(来自文档):

我下载了
elevate.exe
可执行文件,并将其放在我的NetBeans项目文件夹中。然后,我为您要运行的每个
netsh
命令创建一个进程(我做了一些修改,但仅用于测试目的)

免责声明:在Windows 7 Home而非Windows 8上测试

最后,正如@damryfbfnetsi在他的评论中所说,您应该使用
ProcessBuilder
而不是
Runtime
,如下所示:

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();
    }

}
注意:请注意
netshCommand
&退出
结尾。这是因为,如果没有,则由
elevate.exe打开的
cmd
控制台将保持打开状态

输出应如下所示(很抱歉使用西班牙语,但我的窗口使用该语言):

——设置WLAN--
--启动无线局域网--
--设置IPv4接口--
--获取IPv4接口转储--
--打印IPv4接口转储--
#----------------------------------
#IPv4配置
#----------------------------------
pushd接口ipv4
重置设置全局ICMPirects=已启用
添加路由前缀=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
邻苯二胺
#IPv4的配置

如果这是Java 5或更高版本,请不要使用
Runtime.getRuntime().exec()
;使用
ProcessBuilder
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
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();
    }

}