我需要用Java在Windows7-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“http://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/ (在另一个堆栈溢出问题中找到)--它很好用,但是如果我有三个调用,他要求我三次用admin privileges..and执行命令--这对用户不是很友好。
我还试着用"runas":
runas /noprofile /user:administrator netsh ......但在这种情况下,问题是:管理员用户必须是活动的,否则我必须找到一种方法来扫描所有具有管理权限的活动用户。在运行结束后,我必须与提示交互并编写密码。
2)有一种方法可以扫描所有wifi接口上一个netsh命令?
发布于 2013-08-21 13:09:57
我对抬升工具进行了一些研究,并做了一些测试。让它工作的关键是(从文档中):
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命令创建一个单独的进程(我做了一些修改,但只是为了测试目的)。
免责声明:在Windows7Home上测试,而不是在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();
}
} note :请注意以& exit结尾的netshCommand。这是因为如果没有,那么elevate.exe打开的elevate.exe控制台将保持打开状态。
输出应该如下所示(对不起,西班牙语单词,但我的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 IPv4https://stackoverflow.com/questions/18345886
复制相似问题