2013-11-14 19 views
0

我有一個問題,我一直在尋找兩件事必須一起去,通過作爲管理員運行一個過程Createprocess()並獲得輸出。C++作爲管理員createprocess並得到它的輸出

當我Google如何以CreateProcess()作爲管理員時,我得到人們回覆使用shellexecute。我去shellexecute,而我在那裏,shellexecute不輸出在控制檯(進程)上運行的東西。

我再次谷歌我怎麼得到與shellexecute進程的輸出,我得到答案,說你不能用shellexecute做,使用createprocess,所以我去createprocess。我正在努力將我在做的事情與shellexecute轉換爲創建過程。

我在做什麼shellexecute做我想找的,以管理員身份運行。但沒有輸出。

這是我的shellexecute代碼。

SHELLEXECUTEINFO si = {0}; 

si.cbSize = sizeof(SHELLEXECUTEINFO); 
si.fMask = SEE_MASK_NOCLOSEPROCESS; 
si.hwnd =NULL; 
si.lpVerb = "runas"; 
si.lpFile = "netsh.exe"; 
si.lpParameters = "advfirewall firewall  add rule name=\"dummy_rule\" action=allow protocol=TCP dir=in localport=3300"; 
si.lpDirectory=NULL; 
si.nShow=SW_SHOW; 
si.hInstApp =NULL; 
ShellExecuteEx(&si); 
WaitForSingleObject(si.hProcess, INFINITE); 
CloseHandle(si.hProcess); 

此代碼在一個方法中運行,它的作用是添加一個防火牆規則來打開一個端口以阻止連接。它工作的很好,問題是我不知道這個過程是否成功,而不是真正的。所以我需要輸出。

+0

你好,你能找到解決你這個問題的辦法嗎? –

回答

1

您的代碼實際上創建了兩個過程runas.exenetsh.exe,它只能創建一個。正確的做法是:

  1. 使用LogonUser()功能與管理員憑據,以獲得管理令牌。
  2. 撥打CreateProcessAsUser()與您的IO重定向上述令牌。

注意,對於CreateProcessAsUser()應指定netsh.exe你想執行的過程中,並在LPTSTR lpCommandLine你的論點。

+0

因爲我不知道誰在那臺計算機上被允許運行管理任務,我如何登錄適當的用戶而不知道用戶名和密碼 –

+0

好吧,你只需要知道。否則你運行特權代碼是沒有意義的。 –

+0

但先生你知道有些應用程序會提示管理員的用戶名和密碼。他們不知道管理員是誰,但他們要求管理員出來授權,這樣做會更好,而不是在源代碼 –

2

嘗試從這篇文章的CreateProcessElevated()功能:

Vista UAC: The Definitive Guide

它具有相同的功能,但CreateProcess()提供runas功能ShellExecute(),即提示UAC提升憑據用戶。

相關問題