2012-06-13 162 views
66

所以我寫了一個需要訪問註冊表的應用程序。 我沒有觸及任何構建設置,希望在添加其他觸摸(如描述或名稱)之前讓它工作。

突然間,我得到一個不會消失的錯誤。 ClickOnce does not support the request execution level 'requireAdministrator'.現在,我沒有在這個應用程序中觸及ClickOnce。我所做的所有事情都包括一個請求這些權限的清單文件。

我現在的問題是,這個錯誤不會消失,我不能編譯我的程序。有關該做什麼的建議? (旁註:我即將上牀睡覺,所以明天下午我會檢查一下)。「ClickOnce不支持請求執行級別'requireAdministrator'。」

+4

我討厭在這裏陳述明顯的問題,但是*你添加了一個請求'requireAdministrator'權限的清單*並且* ClickOnce開始抱怨說它不支持'requireAdministrator' *。問題應該非常清楚。 ClickOnce在您的清單中看到需要提升(這成爲您的應用程序的一部分)。我不確定你在這裏需要什麼...... –

+2

@KenWhite:然而,也許並非完全明顯也不合邏輯,管理要求與點擊一起使用會阻止您編譯項目,而不僅僅是運行它 - 但它確實如此。 –

+0

@ 500-InternalServerError,邏輯應該告訴你,因爲添加「需要管理員」導致它不能編譯,因爲與「需要管理員不支持」,國際海事組織的事實,因果關係存在。 :-) –

回答

111

編輯:此評論也給出了一個很好的答案。

無論何時單擊「發佈」,無論您是否願意,都可以點擊一次。如果您使用「requireAdministrator」,則看起來您無法使用ClickOnce,因此無法「發佈」您的項目。


原文:

原來,安全選項卡下的 「啓用的ClickOnce安全設置」 進行了調查。儘管我沒有檢查它。 無論如何,取消選中停止ClickOnce給我的錯誤。這花了一段時間發現......

+2

啊,我認爲這是你得到的錯誤信息是明顯的;) –

+2

讓我困惑的是我沒有啓用ClickOnce。 – LMS

+0

好的問題和答案,它幫助了我,謝謝! – Moh

12

如果你曾經使用發佈嚮導,或「立即發佈」,點擊一次複選框被自動選中...

3

拿你app.Manifest看看文件,你會看到這一點:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 

有在評論中有說明,而只是刪除「requireAdministrator」並插入這是地方解決了這個問題對我來說:

<requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
+2

OP表示他們需要訪問他們的應用程序中的註冊表,所以這不是一個選項。 – LeeCambl

+0

當您的應用程序需要它時,這不是一個解決方案... – deadManN

2

我有同樣的問題我通過取消選中「啓用ClickOnce安全設置」來解決此問題 在Visual Studio中查找此選項右鍵單擊您的項目==>屬性==>選擇安全性==>啓用ClickOnce安全性設置(此選項已被選中,因此我取消選中它並解決我的問題)。

34

我知道這樣一個老問題,但我兩年之後來到這裏,所以:

您可以從項目性質在安全選項卡禁用ClickOnce的幫助的問題;見下圖:

enter image description here

-9

只是

Imports System.security 

和 U將得到沒有錯誤,你的申請將被以管理員身份運行

+1

只需簡單地將引用分配給程序集就不會在大多數情況下執行任何代碼。沒有更多的發佈,這沒有告訴我們。這篇文章是關於管理註冊表編輯的要求,更具體地說是通過Visual Studio發佈選項進行部署,該選項生成ClickOnce程序集。 Downvoted由於缺乏清晰度或明顯的相關性。 –

5

我知道這是舊的,但我碰到它跌跌撞撞尋找尋求答案。在我的情況下,我使用發佈功能,我需要繼續使用它。我也需要訪問管理功能。所以出於這個原因,上面的答案都不適合我。

我最終在我的應用程序開始時添加了一個方法,檢查它是否以管理員身份運行,如果不是,則以管理員身份重新啓動。爲此,您需要添加以下參考。

using System; 
using System.Diagnostics; 
using System.Reflection; 
using System.Security.Principal; 

然後你將需要把這個地方,你的主要方法有方便的訪問。我使用的是WPF,所以我將它添加到MainWindow.xaml.cs中,但可以在代碼中的任何地方儘早添加它。只要記得在這些方法中添加「靜態」就可以了。

private void AdminRelauncher() 
{ 
    if (!IsRunAsAdmin()) 
    { 
     ProcessStartInfo proc = new ProcessStartInfo(); 
     proc.UseShellExecute = true; 
     proc.WorkingDirectory = Environment.CurrentDirectory; 
     proc.FileName = Assembly.GetEntryAssembly().CodeBase; 

     proc.Verb = "runas"; 

     try 
     { 
      Process.Start(proc); 
      Application.Current.Shutdown(); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString()); 
     } 
    } 
} 

private bool IsRunAsAdmin() 
{ 
    WindowsIdentity id = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(id); 

    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 

最後,在程序開始時,添加對方法的引用。就我而言,我將它添加到MainWindow中,但將它添加到Main作品中。

public MainWindow() 
{ 
    InitializeComponent(); 
    AdminRelauncher(); //This is the only important line here, add it to a place it gets run early on. 
} 

希望這有助於!

+0

雖然起作用,但你會損失調試點:| – deadManN

+0

@deadManN不確定你的意思。 –

+0

它啓動一個新的實例,由定義不附加到調試器..(你要求新的自由(獨立)的實例,並關閉連接到調試器) – deadManN

1

此操作可以通過選擇「啓用ClickOnce安全設置」(因爲在Publish期間不能「未選中」,如上所述),然後選擇「這是部分信任應用程序」來實現。 「本地內聯網」將在下拉菜單中自動選擇,非常好。

保存您的更改,發佈應用程序,完成滑雪。 :-) Security Settings Snippet

1

這裏是VB.NET

If Not New WindowsPrincipal(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator) Then 
      Process.Start(New ProcessStartInfo With { _ 
                .UseShellExecute = True, _ 
                .WorkingDirectory = Environment.CurrentDirectory, _ 
                .FileName = Assembly.GetEntryAssembly.CodeBase, _ 
                .Verb = "runas"}) 

編輯代碼片段:但是,如果你以這種方式部署,一些AV-軟件模塊的代碼。

+0

爲什麼?一切都很好,該片段和提示,AV可以阻止此代碼甚至是正確的。到處都是一些巨魔。 – Tzwenni

+0

如果有人會如此友善,並能公平地把我的帖子平復爲零,那會很好。 thx – Tzwenni

+0

問題是針對C#的,所以我認爲這就是爲什麼他們低估了 – Lonefish