【问题标题】:Java create wifi hotspot in Windows 8Java 在 Windows 8 中创建 wifi 热点
【发布时间】:2013-08-23 03:27:06
【问题描述】:

我需要在 Windows 7-8 中使用 Java 创建一个 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”http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/(在另一个 stackoverflow 问题中找到)它工作得很好,但是如果我有三个电话,他会问我三次以管理员权限执行命令..这不是很好用户友好。

我也尝试使用“runas”:

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

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

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

【问题讨论】:

  • 如果这是 Java 5 或更高版本,请不要使用Runtime.getRuntime().exec();使用ProcessBuilder

标签: java command-line wifi jvm-hotspot netsh


【解决方案1】:

我在研究elevate 工具并做了一些测试。这是使其工作的关键(来自文档):

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

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

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

最后,正如@damryfbfnetsi pointed out 在他的评论中,您应该使用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& exit 结尾。那是因为如果没有,那么elevate.exe 打开的cmd 控制台将保持打开状态。

输出应该是这样的(对于西班牙语单词很抱歉,但我的 Windows 是那种语言的):

-- 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多