在另一篇文章中已經介紹了給Exe加上Uac的方法,在使用的過程中我們會發現,如果把帶Uac的Exe寫入注冊表的Run中,是無法實現開機自動啟動的,原因就是帶Uac的exe需要申請管理員權限,以便運行執行程序,而在開機時無法申請到管理員權限,Exe將無法正常啟動。那么如何使帶Uac的Exe開機自動啟動呢。
既然帶Uac的Exe開機無法申請到管理員權限,那么可以新建一個不帶Uac的小程序,在其中實現申請管理員權限啟動exe不就可以解決問題了嗎?實現方法如下:
unit DyjStartMainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI; const WM_STARTCLOSE = WM_USER + 100; type TFrmDyjStart = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } protected procedure WMStartClose(var Msg: TMessage); message WM_STARTCLOSE; public { Public declarations } end; var FrmDyjStart: TFrmDyjStart; implementation {$R *.dfm} procedure TFrmDyjStart.FormCreate(Sender: TObject); begin PostMessage(Self.Handle, WM_STARTCLOSE, 0, 0); end; procedure TFrmDyjStart.WMStartClose(var Msg: TMessage); var _vPathExe : string; begin _vPathExe := ExtractFilePath(Application.ExeName) + 'Dyj2.exe'; ShellExecute(0, 'runas', PChar(_vPathExe), nil, nil, SW_SHOWNORMAL); Application.Terminate; end; end.
參考:http://blog.chinaunix.net/uid-20718335-id-364397.html
--------------------------------------------
還可以使用services的方式來實現:
把程序的功能分成兩部分,界面和不需要管理員權限的功能部分寫成一個程序,實現自啟動;需要管理員權限的部分寫成一個服務,安裝后隨系統自啟動。兩者用進程外COM的方式進行訊。
--------------------------------------------
在網上找資料,發現有幾種方法:
通過系統API ShellExecuteExW函數提權,向其參數lpVerb傳入一個“runas”命令(注:該命令是微軟的一個隱藏參數),可以實現開機啟動,並出現UAC提示框,但軟件起來后,一些功能無法正常使用(實測:上面的例子就是彈出一個UAC對話框,需要點擊后方可運行,運行后沒發現有什么功能限制);
通過微軟自己發布的第三方軟件Application Compatibility Toolkit添加UAC白名單方式。同樣可以實現開機啟動,與1方法不同沒有UAC提示框而直接啟動,但問題如1一樣,一些功能無法正常使用;
通過win7系統自己的“系統工具”中的“計划任務”來手動添加。此方法可以實現程序開機啟動,沒有提示框,程序所有功能都能正常實現。
--------------------------------------------
對於Win7開機自啟動,就是你們說的方法。我想提醒一點,惡意軟件會破壞我們的“監控軟件”,使其不能開機自啟動。
解決方法是把我們的驅動設置為boot類型。boot類型的驅動是啟動最早的驅動程序,在系統引導時就必須加載完畢。這樣我們的驅動先取得控制權,隨后HOOK一些關鍵函數(比如驅動加載、進程結束等函數),惡意軟件無法破壞。一些殺掉軟件也是這么做的,比如江民、瑞星、卡巴等。
參考:http://www.dewen.io/q/710/win7%E4%B8%8B%E8%87%AA%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F%E5%A6%82%E4%BD%95%E7%BB%95%E8%BF%87UAC%EF%BC%9F