.NET uygulamamı yönetici olarak çalıştırmaya nasıl zorlarım?


875

Programım bir istemci makineye yüklendikten sonra, programımı Windows 7'de yönetici olarak çalışmaya nasıl zorlayabilirim ?


3
İkili Worrier yazdıklarının yanı sıra, yönetici ayrıcalıklarına sahip olup olmadığınızı test etmek için bazı kodlar yazmak isteyebilirsiniz .. (istediğin bu mu?)
lexu

38
Bu görevi hafifçe almam, aslında yöneticiye neye ihtiyacı olduğunu doğrulamalı ve etrafta çalışıp çalışamayacağınızı görmelisiniz. Hiçbir müşteri, bir uygulamayı her zaman yönetici modunda çalıştırmaktan mutlu olmayacaktır. Birçok büyük müşteri böyle bir uygulamayı bile düşünmeyecek ve logo testi sizin için önemliyse böyle geçmeyecek.
Alex

2
Alex çok önemli. Mümkünse, yalnızca gerektiğinde yükseltin, aksi takdirde Grup İlkesi, UAC ve diğer bazı değişkenler devreye girer. En azından, UAC ile, kullanıcı sadece belirli bir kullanıcı eylemi yerine, her çalıştırmada yetki vermek zorunda kalacaktır.
Anthony Mason

Doğru yol, manifest dosyasını uygulamanıza yerleştirmektir.
Elmue

Yanıtlar:


1144

Programa gömülü olan manifest'i değiştirmek isteyeceksiniz. Bu, Visual Studio 2008 ve daha yeni sürümlerde çalışır: Project + Yeni Öğe Ekle, "Uygulama Bildirim Dosyası" nı seçin. <requestedExecutionLevel>Öğeyi şu şekilde değiştirin :

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

Kullanıcı programı başlattığında UAC istemini alır . Akıllıca kullanın; sabırları çabuk yıpranabilir.


33
Derlemeye çalışırken bir ClickOnce hatası alırsanız, şu yanıta bakın: stackoverflow.com/questions/11023998/…
SSS

17
Projenizin uygulama manifest'ini de kullanacak şekilde ayarlanması gerekir - Proje Özellikleri'nde "Uygulama" sekmesini kontrol edin ve 'Kaynaklar'ın altındaki "Manifest:" öğesinin app.manifest (veya. manifest dosyası).
Victor Chelaru

7
VS yönetici modunda yeniden başlatmamı istemeden önce projeyi yeniden yüklemem gerekiyordu.
Jon

3
@Alejandro - Evet, UAC devre dışı bırakılabilir, ancak bu durumda, uygulama otomatik olarak yönetici olarak çalışacaktır (kullanıcılarınızın yönetici ayrıcalıklarına sahip olduğu varsayılarak), çünkü UAC'nin devre dışı bırakılması, her şeyin izin verilen en yüksek ayrıcalıkta çalıştığı anlamına gelir. Bu, kapıya süslü bir kilit takarsanız, kapı çıkarıldığında işe yaramayacağından şikayet etmek gibidir.
Erik Funkenbusch

4
@ErikFunkenbusch "Yönetici olarak otomatik olarak çalışmaz", kullanıcının normal izinleri altında çalışır (kullanıcı yönetici ise yönetici veya kullanıcı standartsa standart). Bu özel duruma güvenmek, varsayılan olsa bile, iyi programların veba gibi kaçınacağı şeydir. Analojinizi takiben, süslü kilit güzel ve hepsi, ancak uygun şekilde tasarlanmış bir yazılım, nadir bir olay olsa bile, tüm kapının çıkarıldığı durumunu tahmin etmelidir.
Alejandro

154

requestedExecutionLevelManifestinize bir unsur eklemek savaşın sadece yarısıdır; UAC'nin kapatılabileceğini hatırlamanız gerekir. Öyleyse, eski okul yolunu kontrol etmeniz ve kullanıcı yönetici değilse bir hata iletişim kutusu oluşturmanız gerekir (iş parçacığınızı
arayın ).IsInRole(WindowsBuiltInRole.Administrator)CurrentPrincipal


22
Ayrıca kullanabilirsiniz <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> yanı
Mark kram

18
@MarkKram: highAvailable bununla ne ilgisi var? Soru, yönetici zorlamakla ilgilidir, en yüksekAvailable, RequAdrator'dan daha az kısıtlayıcıdır ve yönetici olmayan bir kullanıcının uygulamayı UAC istemi olmadan yükseltilmemiş olarak başlatmasına izin verir, yalnızca yöneticiler istenir ...
Anders

3
İşteIsInRole Anders'in konuştuğu bir MSDN örneği .
Uwe Keim

Artık kesin detayları hatırlamıyorum ama bunun engelli ile ne demek istediğine bağlı olduğunu düşünüyorum. "UAC kaydırıcısını" en alta koymak, UAC'yi devre dışı bırakmakla aynı şey değildir (Vista hariç). UAC tamamen devre dışı bırakılırsa, bütünlük düzeyi mekanizması devre dışı bırakılır ve yalnızca 2000 / XP'deki klasik runas.exe özelliği kullanılabilir. Yönetici rolü denetimi, runas.exe durumunu işler.
Anders

1
EnableLUA'yı Server 2008 R2'de 0 olarak ayarladım ve kendimi Administrators grubundan çıktım, yeniden başlattım ve şimdi level = "requirAdministrator" belirten bir exe herhangi bir komut istemi olmadan çalışıyor
Tal Aloni

86

Ayrıntılı adımlar aşağıdaki gibidir.

  1. Çözüme uygulama bildirim dosyası ekleme
  2. Uygulama ayarını "app.manifest" olarak değiştir
  3. "RequestedExecutionLevel" etiketini zorunlu olarak Yönetici olarak güncelleyin.

Çözüme dosya ekleme

Uygulama Bildirim Dosyasını Seçin

Bildirim seçeneğini belirleyin

Bildirim dosyasını güncelleme

Bu kodu kullanarak ClickOnce'ın güvenlik ayarlarını kapatmanız gerektiğini unutmayın, bunun için Özellikler -> Güvenlik -> ClickOnce Güvenliği'ne gidin


New Item...Yükleyici Hizmeti projemde bir seçenek değil. Uygulama manifestini nasıl ekleyebilirim? Ana projeme ekleyebilirim ama yükleyici değil.
HackSlash

61

Manuel olarak yapmak için bazı kod uyguladı:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
Bu, yalnızca içeriğin Yönetici olarak çalışıp çalışmadığını algılar; uygulamanın OP'nin istediği gibi Yönetici olarak çalışmasını öngörmez
Matt Wilko

5
Bir uygulamayı kendi izinlerini yükseltmeye zorlamanın programlı bir yolu olduğunu düşünmüyorum. Eğer olsaydı, bu oldukça güvenlik riski olurdu, değil mi?
Mark Richman

6
Her ne kadar çözümünüz iyi olsa da, soru farklıydı. ;)
Yash

bu yöntemin yeniden düzenlenmiş bir sürümünü burada görebilirsiniz stackoverflow.com/a/50186997 (öznel)
Hakan Fıstık

Bu soruya cevap vermiyor!
Elmue


19

Visual Studio 2008 üzerinde çalışırken, sağ tıklayın Project -> Add New Itemve ardından seçin Application Manifest File.

Manifest dosyasında etiketi bulacaksınız requestedExecutionLevelve düzeyi üç değere ayarlayabilirsiniz:

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

VEYA

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

VEYA

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

Uygulamanızı yönetici olarak çalışacak şekilde ayarlamak için ortadaki uygulamayı seçmeniz gerekir.


Bu çalışıyor. Ancak, CMD uygulamasını çalıştırırken boş bir cmd penceresi ortaya çıkardı (arka planda bazı exe'leri çalıştırmak için c # cmd uygulamasını kullanarak).
WM

13

Başı

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

zaten bir uygulamanız yoksa veya nasıl ekleyeceğinizi bilmiyorsanız bir uygulama bildirimi eklemek istersiniz. Bazı projeler otomatik olarak ayrı bir bildirim dosyası eklemediğinden, önce proje özelliklerine gidin, Uygulama sekmesine gidin ve projenizin musluğun altındaki manifest'i dışarıda bırakmadığından emin olun.

  • Ardından, sağ tıklama projesi
  • Yeni öğe ekle
  • Son olarak, Uygulama Bildirim Dosyası'nı bulun ve tıklayın

12

Visual Studio 2010'da proje adınızı sağ tıklatın. "Windows Ayarlarını Görüntüle" tuşuna basın, "app.manifest" adlı bir dosya oluşturur ve açar. Bu dosya içinde, "asInvoker" yerine, dosya içindeki yorumlu bölümlerde açıklandığı gibi "requirAdministrator" yazın.


6
Bu cevap genel olarak VS 2010 ile değil, VB.NET :-) ile ilgilidir. "Yeni Öğe Ekle" yanıtları C # ile ilgilidir. C ++ 'da proje ayarlarında yapabilirsiniz.
Philm

12

Bunu yapmanın başka bir yolu, sadece kod olarak , @NG'nin cevabında olduğu gibi, işlemin yönetici olarak çalışıp çalışmadığını tespit etmektir. . Sonra uygulamayı tekrar açın ve geçerli olanı kapatın.

Bu kodu, bir uygulama yalnızca kendini hizmet olarak yüklerken olduğu gibi belirli koşullar altında çalıştırıldığında yönetici ayrıcalıklarına ihtiyaç duyduğunda kullanırım. Bu yüzden diğer cevaplar da zorladığı gibi her zaman yönetici olarak çalışmasına gerek yoktur.

Aşağıdaki kodda NeedsToRunAsAdmin, geçerli koşullar altında yönetici ayrıcalıklarının gerekip gerekmediğini tespit eden bir yöntem bulunmaktadır. Bu döndürürse falsekod kendini yükseltmez. Bu, bu yaklaşımın diğerleri üzerinde önemli bir avantajıdır.

Bu kodun yukarıda belirtilen avantajları olmasına rağmen, kendisini her zaman istediğiniz gibi olmayan yeni bir süreç olarak yeniden başlatması gerekir.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

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

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
Yalnızca kod yaklaşımı için +1. runasYönetici olmayan bir kullanıcıdan yönetici olarak herhangi bir şeyi başlatma şansı elde etmek için UAC'nin etkinleştirilmesi gerektiğini unutmayın , aksi takdirde mevcut kullanıcı izinleriyle sessizce açılır (Windows 7 64 bit'te işaretlenir). Bildiğim kadarıyla UAC devre dışı ve yönetici hakkı eksik ile yapabileceğiniz tek şey yürütme uygun bir anda durdurmaktır.
reallynice

9

Manifest'i ClickOnce Güvenlik Ayarları'nı kullanarak oluşturabilir ve sonra devre dışı bırakabilirsiniz:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Tıkladıktan sonra , Proje'nin app.manifest adlı özellikler klasörü altında bu dosya oluşturulduktan sonra bir dosya oluşturulur, Enable ClickOnce Security Settingsseçeneğin işaretini kaldırabilirsiniz.

Bu dosyayı açın ve şu satırı değiştirin:

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

için:

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

Bu, programın yönetici ayrıcalıkları gerektirmesini sağlayacaktır.


7

Bu , yukarıda @NG tarafından verilen bu cevabın basitleştirilmiş bir versiyonudur.

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
Bu soruya cevap vermiyor!
Elmue

@Elmue, sadece yeniden düzenlediğim orijinal cevaba yorumunuzu eklemek daha mantıklı, benim için bu cevaba bir bağlantı bulabilirsiniz.
Hakan Fıstık

-3

Yürütülebilir dosyayı sağ tıklatın, Özellikler> Uyumluluk bölümüne gidin ve 'Bu programı yönetici olarak çalıştır' kutusunu işaretleyin.

Tüm kullanıcılar için yönetici olarak çalıştırmak istiyorsanız, 'tüm kullanıcılar için ayarı değiştir' için de aynı işlemi yapın.


4
Bu soruya cevap vermiyor. "Programım bir istemci makineye kurulduktan sonra" değil, "nasıl yaparım".
Joe

Belirsiz olduğum için üzgünüm. Programınız yüklendikten sonra, çalıştırılabilir öğenizin özelliklerinde (yükleyicide değil ana programınızda) bu ayarı değiştirin. Programını yönetici olarak çalışmaya zorlamak istiyor.
SlickJayD

2
Manifest'te yönetici gereksinimini ayarlamak daha iyidir. Soruyu cevapladığını iddia ediyorum, ama zar zor.
BradleyDotNET

3
@Joe Adil olmak gerekirse, kabul edilen cevap, uygulama exe'yi yeniden yüklemenizi gerektirdiği için OP sorusuna cevap vermez. Bu, "Programım yüklendikten sonra" için pek bir çözüm değil. Bu düşürülmüş cevabın kabul edilen cevaptan daha doğru olması durumunda, bu cevabın neden 400+ oyu olduğunu anlamıyorum.
NickG

Aslında her iki soruya da mükemmel cevap veriyor. Kurulduktan sonra manifest değiştirme şansı çok fazla değil ve programlar çalıştırıldıktan sonra izinlerini yükseltmeye çalışmamalıdır - birçok ortamda - kötü amaçlı yazılım olarak adlandırılmanın iyi bir yoludur. Çoğu şirkette - bu cevap en iyisidir çünkü kullanıcıyı ve izinlerini kabul eder. Ben ne "görmek" ya da bir kez üretimde çalıştırabilirsiniz kod bir sürü yazmak. Kendi güvenlik endişelerinizden daha akıllı olmamaya çalışın.
jinzai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.