2016-04-24 44 views
-2

我有一個用舊的Borland C++編譯器創建的exe。它需要管理員權限才能正常運行。由於該應用程序將在啓動時運行,因此我不希望用戶提示是否可以運行該程序(在Win7上進行測試)。我的問題是,有沒有辦法在每次運行應用程序時刪除令人討厭的提示?Windows UAC安全與Exe

我添加了一個包含管理權限的清單文件並對其進行了簽名,但它仍然以發佈者名稱顯示。

這將分發,所以我不希望用戶不得不關閉UAC或做任何太複雜的事情。任何建議,非常感謝。

我希望有一些UAC像「永遠信任這個計劃」或什麼的東西。

+0

這將打敗UAC的全部目的。 –

+0

不,我希望有像UAC這樣的東西,比如「Always Trust This Program」等等。請刪除您的-1。 – kizeloo

+0

這不是我的-1,但我會在那裏扔一個+1,甚至出來 –

回答

1

答案是使用計劃任務在登錄時運行。計劃任務由以SYSTEM權限運行的任務計劃程序服務啓動,因此可以在不提示用戶啓動時使用提升權限運行計劃任務。您仍然必須獲得用戶的確認一次 - 當您設置計劃任務時 - 但不是每次程序運行時。

由於我不知道如何安裝程序(您使用的安裝程序,如果有的話),我會向您描述一種您可能在任何環境中實現的方式:使用schtasks.exe和一個XML文件。 (請注意,這不會與Windows XP和更早的版本,但你不必擔心UAC反正。)

您需要創建這樣一個XML文件:

<?xml version="1.0" ?> 
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
     <Date>2013-11-01T00:00:00.0000000</Date> 
     <Author>USERDOMAIN\USERNAME</Author> 
    </RegistrationInfo> 
    <Triggers> 
     <LogonTrigger> 
      <Enabled>true</Enabled> 
      <UserId>USERDOMAIN\USERNAME</UserId> 
     </LogonTrigger> 
    </Triggers> 
    <Principals> 
     <Principal id="Author"> 
      <RunLevel>HighestAvailable</RunLevel> 
      <UserId>USERDOMAIN\USERNAME</UserId> 
      <LogonType>InteractiveToken</LogonType> 
     </Principal> 
    </Principals> 
    <Settings> 
     <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
     <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> 
     <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
     <AllowHardTerminate>false</AllowHardTerminate> 
     <StartWhenAvailable>false</StartWhenAvailable> 
     <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
     <IdleSettings> 
      <StopOnIdleEnd>false</StopOnIdleEnd> 
      <RestartOnIdle>false</RestartOnIdle> 
     </IdleSettings> 
     <AllowStartOnDemand>true</AllowStartOnDemand> 
     <Enabled>true</Enabled> 
     <Hidden>false</Hidden> 
     <RunOnlyIfIdle>false</RunOnlyIfIdle> 
     <WakeToRun>false</WakeToRun> 
     <ExecutionTimeLimit>PT0S</ExecutionTimeLimit> 
     <Priority>7</Priority> 
    </Settings> 
    <Actions Context="Author"> 
     <Exec> 
      <Command>c:\path\to\your\app.exe</Command> 
      <Arguments>/your /parameters</Arguments> 
     </Exec> 
    </Actions> 
</Task> 
  • 將所有USERDOMAIN\USERNAME替換爲實際用戶的域和名稱。例如,您可以從相應的環境變量USERDOMAINUSERNAME中讀取這些變量。
  • c:\path\to\your\app.exe替換爲您的應用程序的路徑,並將/your /parameters替換爲您要傳遞給應用程序的參數(如果有)。
  • 這裏的祕密魔力在於<RunLevel>HighestAvailable</RunLevel>這將使任務調度程序運行您的應用程序提升。
  • Date並不重要,但爲了完整性您可以將其設置爲當前日期和時間。

創建XML文件並保存到某個地方(如臨時文件夾)之後,你必須運行此命令,它會創建實際的任務:schtasks.exe /Create /TN "My App" /F /XML "c:\path\to\xmlfile.xml"(更換My App與應該出現在任務調度名稱看時)。

您可以使用schtasks.exe /Delete /TN "My App"再次刪除任務。

(對於純C++的解決方案,你也可以採取this example並添加缺少的東西將被指定的用戶名並設置標誌使用最高可用權限。)

0

我寫這因爲雖然CherryDT的答案是一種很好的方法,根據具體情況而定,可能會稍微不靈活。

另一種選擇(根據上下文)可重構分爲兩個部分:

  1. 它在啓動時運行,確實需要管理員權限的一切系統服務
  2. ,隨着通信的客戶端程序服務並且不需要管理員訪問。

這樣可以避免令人討厭的提示,但這是更多的工作。根據你的描述,目前尚不清楚這是去這裏的正確方法,但它可能在路上(以及其他人找到這張票),所以我認爲這是值得一提的。