[爆卦]系統管理員身分執行是什麼?優點缺點精華區懶人包

為什麼這篇系統管理員身分執行鄉民發文收入到精華區:因為在系統管理員身分執行這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者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
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

你可能也想看看

搜尋相關網站