看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《hccash (風雨飄搖)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VS 2012 : 問題(Question): : 請問版上的前輩們 : 今天我有個.exe file 但是需要用管理員的身分執行才有效果 : 如果我直接在code中 使用system("xxxx.exe") 是沒有效果的 : 是否有其他方式或需要怎麼寫才能讓system能夠有administrator的身分? : 謝謝指教 我提供 Media Player Classic - Home Cinema 的做法當案例。 當 mpc-hc.exe 進入 "選項設定-檔案關聯" 視窗時,假設有人勾選副檔名 *.wav, 卻不是系統管理員身份,也就是說 IsUserAnAdmin() == FALSE, 則勾選會失敗,並告知應使用旁邊的 "Modify" 按鈕。 按下該按鈕後,進行 Administrator 身份確認程序, 通過後,跳出新的 "選項設定-檔案關聯" 視窗, 此時 mpc-hc 的其他操作介面一律被鎖住,設定結束後才能恢復。 大致為以下三步驟: 1. 設定檔案關聯時,使用者按下 Modify 按鈕。 2. 以系統管理員身份,啟動另一個 mpc-hc.exe, 並直接進入 "檔案關聯" 設定,其他介面一律鎖住。 3. 管理員版 mpc-hc.exe 設定結束後,該程式自行關閉,回到 Modify 按鈕被點擊處。 runas.exe /user:administrator "mpc-hc.exe /adminoption 10027" 步驟二,可用上述指令完成。 參數中的 10027 為 Dialog Resource ID,用 Resouce Hacker 可查到。 但 runas.exe 為 console 程式,會跳出 "命令提示字元" 來要求密碼,這樣不太方便。 實際上 mpc-hc 的做法是這樣: SHELLEXECUTEINFO execinfo; memset(&execinfo, 0, sizeof(execinfo)); // 成員賦值為 0 execinfo.lpFile = TEXT("mpc-hc.exe"); execinfo.cbSize = sizeof(execinfo); execinfo.lpVerb = TEXT("runas"); // 不等於 runas.exe execinfo.fMask = SEE_MASK_NOCLOSEPROCESS; execinfo.nShow = SW_SHOWDEFAULT; execinfo.lpParameters = TEXT("/adminoption 10027"); ShellExecuteEx(&execinfo); WaitForSingleObject(execinfo.hProcess, INFINITE); 相當於在桌面上對 mpc-hc.exe 按右鍵,透過 shell (explorer.exe) 的 右鍵動作 "runas" 來處理,台灣講法是 "以系統管理員身份執行(A)"。 註:如果按右鍵之前,先按下 shift 鍵不放,則會多出 "runasuser", 台灣翻譯為 "以不同的使用者身份執行(F)"。 要查詢 shell 對某檔案類型,有支援哪些 shell verbs,舊版 Windows 可以用 檔案總管-資料夾選項-檔案類型,叫出圖形介面來編輯,在 Win 7 應該只能用機碼: HKEY_CLASSES_ROOT\exefile\shell\runasuser HKEY_CLASSES_ROOT\exefile\shell\runas 表示對於 .exe 副檔名,所對應的 exefile 檔案類型,有支援上面這兩個動作。 詳細文件可參考:http://msdn.microsoft.com/en-us/library/cc144175.aspx .-. .-. / \ .-. .-. / \ / \ / \ .-. _ .-. / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / `-' `-' \ / \ / \ \ / `-' `-' \ / `-' `-' 借標題一問,有什麼比較好用的 "線上" 程式碼搜尋引擎? 求分享求籠罩,謝謝。 我只知道 http://code.google.com/codesearch 還有 github 的搜尋引擎:http://tinyurl.com/axfus4k 如果要限定查 sourceforge.net 的某專案程式碼,我就不知道怎麼用了, 還是說只能自己抓 source 回電腦再搜尋? .-. .-. / \ .-. .-. / \ / \ / \ .-. _ .-. / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / `-' `-' \ / \ / \ \ / `-' `-' \ / `-' `-' 同場加映 不透過 IDE,自己下指令讓 *.exe 與 *.exe.manifest 合體, 每當執行 *.exe 時,都要求 "系統管理員" 身份才可運行。 指令不難,兩行結束: cl.exe 檔名.c /link /MANIFEST /MANIFESTUAC:"level='requireAdministrator'" mt.exe -manifest 檔名.exe.manifest -outputresource:檔名.exe 指令一,生成「檔名.exe」跟「檔名.exe.manifest」這兩個檔案; 指令二,把「檔名.exe.manifest」內嵌進「檔名.exe」 這樣以後就不需要「檔名.exe.manifest」這個檔案了。 可以從這篇 MSDN:http://msdn.microsoft.com/en-us/library/bb384691.aspx 查到透過 link.exe 的選項 /MANIFESTUAC 能達到 "要求系統管理員身份"。 == 陷阱 1 是,文件沒說如果不加 /MANIFEST 選項,則怎樣餵 /MANIFESTUAC 都無法 生成 manifest 檔,相當於做白工,所以一定要加 /MANIFEST。 == 陷阱 2 是,文件告訴我們參數要這樣下: "level=[ asInvoker | highestAvailable | requireAdministrator ]" 如果照著做,則: cl.exe 檔名.c /link /MANIFEST /MANIFESTUAC:"level=requireAdministrator" 可以成功編譯連結,但是 "檔名.exe" 無法執行。 雙引號失敗: cl.exe 檔名.c /link /MANIFEST /MANIFESTUAC:"level="requireAdministrator"" 跳脫字元依然失敗: cl.exe 檔名.c /link /MANIFEST /MANIFESTUAC:"level=\"requireAdministrator\"" 總之只能用單引號,但 MSDN 沒講清楚就對了。 == 如果在原始碼中加上: #pragma comment(linker, "/MANIFESTUAC:level='requireAdministrator'") 則回報: warning LNK4229: 出現無效的 指示詞 '/MANIFESTUAC:level='requireAdministrator'',已忽略 這個語法可以自動設定參數給 link.exe, 可以用 /MANIFESTDEPENDENCY,卻不認識 /MANIFESTUAC 不是所有的連結器選項都支援。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.144.170
hccash:謝謝解答 講解的很詳細 我會在code中試試 謝謝 02/01 11:11
b98901056:好酷的分隔線XD 02/01 11:49
EdisonX:p大這篇幾乎是 Q&A 回覆等級的文章了,推一個 :) 02/01 19:07
EdisonX:搜尋引擎我還有用 Koders http://code.ohloh.net/ 02/01 19:08
purpose:謝謝,不錯的網站,可以查到微軟 codeplex.com 上的原始碼 02/01 19:46