2015-06-22 153 views
0

我正在Delphi 10上開發用於Windows 10的軟件,我必須在10上運行我的軟件並具有管理員權限。如果我右鍵單擊exe文件並以管理員身份運行它,它不會引發任何錯誤,但如果我運行它以任何其他方式程序引發錯誤消息Access Denied。所以,它需要具有管理員身份。最初我以爲你可以使用任務調度程序來完成這個任務,但它也有問題。現在,我正在學習我需要在Windows 10上進行自定義清單。因此,在通過一些stackoveflow問題,博客和網站在線之後,我爲我的程序創建了一個清單,如下所示,但是,當我運行我的程序時,它會引發Access Denied錯誤消息。如何使用Windows 10的清單設置管理員權限?

這是我做過什麼:

創建的清單文件(GeoMonitor.manifest)使用記事本:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0"> 
<assemblyIdentity version="1.1.1.1"> 
processorArchitecture="*" 
name="GeoMonitor" 
type="win32" /> 
<description>elevate execution level</description> 
<dependency> 
<dependentAssembly> 
<assemblyIdentity> 
type="win32" 
name="Microsoft.Windows.Common-Controls" 
version="6.0.0.0" 
publicKeyToken="6595b64144ccf1df" 
language="*" 
processorArchitecture="*"/> 
</dependentAssembly> 
</dependency> 
<trustinfo xmlns="urn:schemas-microsoft-com:asm.v2"><security> 
<requestedPrivileges> 
<requestedExecutionlevel level="requireAdministrator" uiAccess="false" /> 
</requestedPrivileges> 
</security> 
</trustinfo> 
</assembly> 

創建RC文件GeoMonitor.rc使用記事本

1 24 GeoMonitor.manifest 

在取消選中選項0後,將這兩個文件鏈接到我的項目文件項目選項中的。

enter image description here

最後,我遵守我的項目文件沒有問題,然後測試編譯過的EXE文件在Windows 10,它仍在運行作爲用戶不是管理員。我究竟做錯了什麼?

更新: 有什麼我必須在我的項目選項 - 資源編譯器部分設置?

enter image description here

+0

你是如何「鏈接這兩個文件」?你看過[這個問題的第二個答案](http://stackoverflow.com/a/6227554/62576),包括評論? –

+0

@KenWhite我實際上是通過右鍵單擊項目名稱並在彈出菜單中單擊添加選項將這些文件添加到我的程序項目文件中。另外,我注意到RC文件被鏈接到我的DPR文件,就像'{。$ R'GeoMonitor.res''GeoMonitor.rc'}''我在網上閱讀,你不需要分別編譯RC文件,Delphi編譯器會爲你做到這一點。 – ThN

+0

隨着那裏的點('{。$ R}'),這是一個無所事事的聲明(實際上是一個評論)。爲了使它實際上成爲編譯器指令,您需要移除'.'以離開'{$ R'GeoMonitor.res''GeoMonitor.rc'}'。這將解釋爲什麼它不起作用 - 清單從未包含在內。 –

回答

5

我認爲你有兩個問題:

  1. 您沒有到.RC資源腳本文件編譯成與.RES擴展編譯資源,以及連接這一點。您不應鏈接.rc文件或.xml文件。您需要鏈接編譯後的.res文件。使用brcc32或rc編譯資源腳本。
  2. 我可以告訴你沒有鏈接.res文件,因爲你的清單是無效的。如果您編譯並鏈接了該文件,則加載器將因無效清單而拒絕您的可執行文件。

這裏有您需要的最低清單:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <security> 
      <requestedPrivileges> 
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

顯然你要添加更多的,但是從這裏開始,與已知是良好的清單文件。證明它可以像你期望的那樣工作。然後添加更多功能。

最後要說明的是,我懷疑你一直習慣於禁用UAC。這是一個非常糟糕的主意,對於開發者來說更​​是如此。如果您在過去的10年中使用了UAC,那麼您很久以前就會遇到所有UAC /標準用戶問題。

+0

沒有爭論,只是記憶失敗和好奇:沒有德爾福過去包括InstallShield或類似的裁減版本? – MartynA

+0

@MartynA我不明白這與問題或此答案有何關係。但我記得有些古老的德爾福中有些減少了IS。 –

+0

我的意思是說,正在進行的專業安裝程序及其文檔的包含可能會鼓勵Delphi開發人員與UAC等人握手,而不是讓他們絆倒它或試圖繞過它。 – MartynA

-1
function CreateRunAsAdmin(const AppNamePath: string): boolean; //AppNamePath=CreateRunAsAdmin(Application.ExeName); 
var 
    RegisterTemp: TRegistry; 
    openResult: Boolean; 
begin 
    RegisterTemp := TRegistry.Create; 
    with RegisterTemp do 
    begin 
     RootKey := HKEY_CURRENT_USER; 
     //openResult:=OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', True); 
     OpenKey('\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', True); 
     WriteString(AppNamePath, 'RUNASADMIN'); 
     Result := True; 
     Free; 
    end; 
end;