2014-03-05 43 views
1

我們開發了一個安裝在IE8 +中的ActiveX窗體控件。 此控件檢查註冊表項,然後根據需要下載並安裝一個小設置。 對於管理員而言,所有IE 8+版本的Windows 7和8都可以正常工作。它將下載可執行文件client_setup.exe,路徑爲C:\ users \ user \ AppData \ Local \ Temp \ Low \,但是當使用非管理員用戶時,控制器將運行(它必須由管理員安裝,但是沒問題)它嘗試運行可執行文件(shellexec或createprocess產生相同的結果)需要一個管理帳戶,並出現UAC提升提示。ActiveX無法運行.exe但無權限提升

如果非管理員用戶下載並安裝相同的設置,則不需要管理權限(我們在exe文件中聲明瞭此權限)。此設置完全安裝在用戶配置文件和HKCU註冊表中。

我知道ActiveX控件像IE進程一樣以低權限運行。但爲什麼在這種情況下需要提升?我們的設置不需要特權。

我試圖在低海拔人權政策的例外這裏

HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Internet Explorer\Low Rights\ElevationPolicy 

但仍然出現UAC提示添加ActiveX控件。

我想允許爲所有用戶運行此設置。我們可以以管理員身份運行一次腳本來授予整個系統的權限。有人可以幫助完成這項任務嗎?

TEST 1

以非管理員用戶,我試圖手動安裝由ActiveX下載的.exe和我得到一個系統錯誤,不能寫入到臨時目錄。如果我用Internet Explorer下載相同的exe文件,我可以安裝這個沒有問題。

我檢查與ICACLS和exe文件通過ActiveX控件下載有強制性標籤\低強制性級別:(I)(NW)

TEST 2

網站添加到受信任的站點爲Taxilian建議。作爲非管理員用戶,ActiveX現在將.exe安裝程序保存到C:\ users \ user \ AppData \ Local \ Temp(不低),.exe不再具有低級別標籤。但是,CreateProcess引發UAC提示並失敗。

這是我的CreateProcess代碼。它是Delphi代碼,但它應該是可讀的。

function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): Longword; 
var 
    StartupInfo: TStartupInfo; 
    ProcessInfo: TProcessInformation; 
begin 
    FillChar(StartupInfo, SizeOf(StartupInfo), #0); 
    StartupInfo.cb := SizeOf(StartupInfo); 
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; 
    StartupInfo.wShowWindow := ShowCmd; 
    if not CreateProcess(nil, 
    @Filename[1], 
    nil, 
    nil, 
    False, 
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, 
    nil, 
    nil, 
    StartupInfo, 
    ProcessInfo) 
    then 
    Result := WAIT_FAILED 
    else 
    begin 
    if wait = FALSE then 
    begin 
     if ProcID <> nil then 
     ProcID^ := ProcessInfo.dwProcessId; 
     result := WAIT_FAILED; 
     exit; 
    end; 
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
    GetExitCodeProcess(ProcessInfo.hProcess, Result); 
    end; 
    if ProcessInfo.hProcess <> 0 then 
    CloseHandle(ProcessInfo.hProcess); 
    if ProcessInfo.hThread <> 0 then 
    CloseHandle(ProcessInfo.hThread); 
end; 

這是.exe清單。這是一個簡單的設置,將一些文件複製到用戶配置文件並在HKCU中添加註冊表項。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity name="JR.Inno.Setup" processorArchitecture="x86" version="1.0.0.0" type="win32" /> 
    <description>Inno Setup</description> 
    <dependency> 
     <dependentAssembly> 
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" /> 
     </dependentAssembly> 
    </dependency> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <security> 
      <requestedPrivileges> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
    <application xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <windowsSettings> 
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> 
     </windowsSettings> 
    </application> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
     <application> 
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" /> 
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" /> 
     </application> 
    </compatibility> 
</assembly> 
+0

當您使用'CreateProcess'嘗試啓動可執行文件時會發生什麼? 'CreateProcess'是否返回錯誤代碼?您是否嘗試過使用Process Monitor來跟蹤事件的順序? –

+0

CreateProcess返回錯誤代碼1,這對我沒有意義。實際上,由於UAC提示,CreateProcess失敗。 – Ghigo

+0

也許沒有主題,但: - 爲什麼當CreateProcess失敗時調用'CloseHandle'事件? - 當Wait = False時,你不會調用'CloseHandle' - 如果你的'Filename'將包含空格,並且它不會被雙引號,那麼你將失敗 – kibab

回答

2

Windows UAC使用一些啓發式檢測安裝程序。

http://blogs.msdn.com/b/uac/archive/2006/01/13/512776.aspx

的O/S,使應用程序看起來像一個安裝程序 或更新,並會自動調用擡高到具有管理權限/權限運行程序 當用戶運行它的決定。這個決定是基於啓發式的。下面是一些啓發式 檢測點,雖然這個名單並不詳盡:

  1. 文件名檢測 - 查找單詞「設置」,「更新」,在文件名 「安裝」

我們的設置名稱是client_setup.exe,所以即使不需要UAC,也會觸發UAC,要求管理權限,完全忽略EXE清單。我們稱之爲一個功能。

client_setup.exe重命名爲client.exe就足夠了,然後運行它。沒有出現UAC提示並且安裝成功完成。

這看起來像是微軟最近的一次改變。就在最近4個月前,我們的設置沒有錯誤地啓動。

+0

行''requestedExecutionLevel level =「asInvoker」/>'應該足以繞過啓發式。我認爲'trustInfo'元素必須位於** v2 **名稱空間中,而不是** v3 **名稱空間中。 – acelent

+0

似乎exe名稱覆蓋了manifest執行級別。爲什麼v2改爲v3?一些文檔? – Ghigo

+0

嗯,我可以問你同樣的事情。你嘗試過使用** v2 **嗎?從[某些](http://msdn.microsoft.com/en-us/library/bb545961.aspx)[MSDN](http://msdn.microsoft.com/en-us/library/bb531381.aspx)[文檔(http://msdn.microsoft.com/en-us/library/ws1c2fch。aspx)我可以發現,這些示例如下所示:** v2 **表示'trustInfo'和'security',** v3 **表示'requestedPrivileges'和'requestedExecutionLevel'。 – acelent

0

這並不是說必須是registered to run as a medium integrity process ActiveX控件,它是你從說ActiveX控件啓動EXE。

+0

但你如何解釋,當activeX保存EXE這個有低強制性設置?在我看來,ActiveX運行的水平很低。 – Ghigo

+0

是的,如果您啓用了UAC,則ActiveX始終以低完整性進程運行。對此你可以做任何事情。 – taxilian

+0

因此,您確認管理員完全沒有辦法將特定ActiveX從低級升級到中級?一些註冊表設置,IE設置,域策略? – Ghigo