GCC及VS編寫應用程式獲取管理員許可權

2021-08-01 13:52:16 字數 2849 閱讀 6955

**

在mingw或vs 2005 sp1環境下建立乙個要求uac許可權的程式。

之前在給u盤掛自製作業系統的那篇教程裡,我給寫了乙個pdev程式用來輸出windows下,系統各磁碟的主引導記錄。

不過那個程式用起來每次都要記得用管理員許可權啟動程式,這多少增加了不便。(特別是對帶uac功能的win7\vista來說)。

如果能讓程式啟動時自動要求提權,那當然更符合windows程式的一般習慣。

我查到了一篇這種做法的教程:

也就是需要用到以下這個xml檔案(儲存成uac.manifest檔案,不過還可以儲存成任意的.manifest檔案也行。

程式清單檔案

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

xmlns="urn:schemas-microsoft-com:asm.v1"

manifestversion="1.0">

xmlns="urn:schemas-microsoft-com:asm.v3">

level="requireadministrator"/>

requestedprivileges>

security>

trustinfo>

assembly>

下面具體講

講在mingw或者vs2005 sp1的情況下該怎麼做。

vs2005下簡單,只需要在專案的資源裡加這個uac.manifest檔案即可。

我在vs2005的「新增資源」一項裡沒有找到「新增程式清單」,索性我選擇了新增xml檔案,並儲存為uac.manifest,把以上內容複製到檔案中,

再編譯,就生成了啟動時會提示uac提權的提示框。(這種要求uac提權的程式不能直接用f5除錯執行,在vc裡如果要直接看效果可以按ctrl + f5 直接執行)。

在mingw下,這個問題要稍複雜那麼一點點。

需要在.rc資源文

#include 

1rt_manifest uac.manifest

這include

#define rt_manifest 24
windres --input-format

=rc -o coff -i uac.rc -o uac.res

這樣就產生了uac.res資源檔案,再接下來用gcc將它和程式原始檔一起編譯就可以了。於是問題解決!

當然如果嫌這樣的.rc檔案長了,或者不願意include乙個winuser.h檔案,可以寫成更加簡短的版本:

1

24 uac.manifest

效果一樣。(在vc中也可以做同樣處理,如果你想在資源裡新增對程式清單的描述的話。)

寫這篇文章參考了以下幾個**,如果需要深入這個問題可以作為參考:

(windows vista for developers——第四部分:使用者帳號控制(user account control,uac))

這篇文章需要詳細關注「使用應用程式清單」這一部分。

總之原理就是,pe檔案的資源中有一種型別是rt_manifest,它的內容實際上是乙個xml檔案,被稱為程式清單檔案。

換句話說,這個xml格式的.manifest檔案檔案會被打包進可執行程式檔案中。

而程式清單檔案中描述了執行程式需要的許可權,因此借助這個機制,有uac管理功能的windows系統會在啟動程式時向使用者要求提權。

下面把我的pdev程式貼一下,作為乙個要求uac提權的程式的有趣的例子。它可以判斷系統中有哪些磁碟,並列印出磁碟的主引導記錄。

(注意,這類程式即使在命令列開啟,windows仍然會開啟乙個新的命令列視窗執行程式,並且程式路徑是乙個完整路徑,

因此這時候我們的命令列程式不得不總是在將要推出前用系統的pause命令做暫停,否則使用者看到的會是乙個一閃而過的視窗。

**

#include 

#include

#include

void showerror()

void readdevice(handle hdevicehandle,int drivenumber,file *output_file)else

perror("讀取裝置時發生錯誤");

puts("請檢查您是否正以管理員賬戶執行此程式,");

printf("或許物理驅動器%d不存在.\n",drivenumber);

showerror();

system("pause");

exit(-1);

}if(nbytes > 0)

printf(" %02x",buffer[icount]);

}printf("\n ----\t ");

for(icount = 0; icount < 16; ++icount)

printf("\n\n");

if(output_file != null)

}else

}int main(int argc,char *argv)

}else

}else

for(icount = 0; icount < 256; ++icount)

return

0;}

編譯之前我們先用之前的uac.manifest檔案和uac.rc檔案準備好我們的uac.res資源檔案:

windres --input-format

=rc -o coff -i uac.rc -o uac.res

gcc -o pdev pdev.c uac.res

Sphinx應用程式編寫

pocketsphinx api核心理念 pocketsphinx api 被設計是為了減輕編寫語音識別功能應用程式。由於使用抽象類,所以在源 和二進位制檔案相容方面,更能保持穩定。因為它完全可重入,所以在同一程序中擁有多個編碼器也不會出現問題。在執行時,新的語言模型的介面 在sphinxbase ...

如何編寫應用程式

每次要編寫嵌入式應用程式的時候總是不知道該如何入手,於是簡單的研究了下現在普遍的掃碼支付模組的sdk開發結構。拿到乙個專案需求時,我們需要看下該專案分為幾個模組,每個模組之間又是以什麼形式連線的。模組化會使程式結構清晰,維護也會方便很多。比如說掃碼支付模組就分為三個部分,底層core部分,mqtt功...

21 編寫iOS應用程式

原文 1 引言 2 objective c 程式設計 3 類 物件和方法 4 資料型別和表示式 5 迴圈結構 6 選擇結構 7 類8 繼承 9 多型 動態型別和動態繫結 10 變數和資料型別 11 分類和協議 12 預處理程式 13 基本的c語言特性 14 foundation框架簡介 15 數字 ...