我們開發了一個安裝在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>
當您使用'CreateProcess'嘗試啓動可執行文件時會發生什麼? 'CreateProcess'是否返回錯誤代碼?您是否嘗試過使用Process Monitor來跟蹤事件的順序? –
CreateProcess返回錯誤代碼1,這對我沒有意義。實際上,由於UAC提示,CreateProcess失敗。 – Ghigo
也許沒有主題,但: - 爲什麼當CreateProcess失敗時調用'CloseHandle'事件? - 當Wait = False時,你不會調用'CloseHandle' - 如果你的'Filename'將包含空格,並且它不會被雙引號,那麼你將失敗 – kibab