2013-12-13 113 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