2013-12-13 75 views
2

这听起来很简单,但我已经把头靠在墙上数周了。我有一个C++程序,需要获得以下Windows命令行命令的输出:获取“netsh dhcp server ...”命令的输出

netsh dhcp server 192.168.200.15 scope 192.168.200.0 show clients 1 

来吧,试试,用你的DHCP服务器替换192.168.200.15(对我来说这是一个在Windows 2003服务器 - - 我猜你的DHCP服务器必须是Windows才能使用这个命令)和192.168.200.0和你所在的子网。它会生成一个很好的MAC地址列表,IP地址,主机名等等。现在我需要得到那个输出!

  1. 使用_popen和_pclose的C++中的标准输入/输出不起作用。输出是空白
  2. Ruby没有工作... ruby -e "puts ``netsh dhcp...“'给我什么
  3. Python不工作... import subprocess, subprocess.call('netsh dhcp...')给我什么
  4. 在批处理文件中的命令,并附加”> SomeFile .txt“如果我从命令行运行,但是如果任何这些方法调用批处理文件运行,即使使用”/ start“开关也不行。如果我执行批处理文件手动,但不是如果一个程序调用它。所以令人沮丧。

我敢肯定,我试过更多的方法,这些只是我记得的工具。我的系统是Windows 7专业64位。可能无所谓,因为有关“netsh dhcp server ...”命令会使输出进入...某处?我看过STDOUT和STDERR。其他的netsh命令很好,例如“netsh show helper”,但是与DHCP服务器的通信使得该文本无法获得。

我甚至跑到Wireshark捕获的长度,看看我是否可以采取嗅探的数据,我想离开电线的路线。
All packets showed up right after executing the command This is the second page... You can see it goes into RPC stuff

所以它开始了与LDAP的东西,那么RPC的东西,我似乎所有这些都不能提取我需要的信息,也不是我能理解的RPC协议。但我想要的只是命令的输出!我觉得我不应该这么做。

如果任何人有任何想法如何只是得到这个令人毛骨悚然的命令的输出,即使只是一个文件,我是所有的耳朵。我可以使用编程轻松获取文件的输出。

回答

0

一些选项:

1)这个命令需要管理员权限,你确定你运行该程序的管理员?

2)您正在使用不能读取和写入的_popen。尝试使用ShellExecute,像ShellExecute(0, "open", "cmd.exe", "/C *yourCommand* > output.txt", 0, SW_HIDE);

+0

我正在编译并以管理员身份运行。 ShellExecute执行正常,并且output.txt被创建,但是完全是空的。 – armani

0

DHCP服务器API在PowerShell全面暴露 - 这意味着有可用的一堆.NET类的,你可以包装成COM或者本地DLL函数,您可以从您的调用C++应用程序是您准备将.NET运行时加载到进程中。

当然,您可以反编译包装以查看它们如何获取数据,然后复制相同的本机路径以绕过CLR堆栈。

+0

我已经探究过PowerShell选项,并且他们提出了同样的问题。我无法反编译包装,也不能将.NET运行库的东西加载到我的应用程序中。 – armani

+0

为了这个工作,必须有一个RPC与服务器通信。如果你可以找到负责这个的功能,确定它的签名,你可以(不支持保证)直接调用它。类似于依赖或procview将允许你在你需要的netsh命令中建立调用树。 – Pekka

0

非常晚,但万一有其他人发现这... 您可能需要在工作站上运行 netsh add helper dhcpmon.dll