為什麼這篇系統管理員身分執行鄉民發文收入到精華區:因為在系統管理員身分執行這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者purpose (purpose)看板C_and_CPP標題Re: [問題] 如何用系統管理員身...
※ 引述《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