Programım bir istemci makineye yüklendikten sonra, programımı Windows 7'de yönetici olarak çalışmaya nasıl zorlayabilirim ?
Programım bir istemci makineye yüklendikten sonra, programımı Windows 7'de yönetici olarak çalışmaya nasıl zorlayabilirim ?
Yanıtlar:
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.
requestedExecutionLevel
Manifestinize 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
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
yanı
IsInRole
Anders'in konuştuğu bir MSDN örneği .
Ayrıntılı adımlar aşağıdaki gibidir.
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.
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;
}
EXE dosyasına bir manifest dosyası gömebilirsiniz, bu da Windows'un (7 veya daha yüksek) programı her zaman yönetici olarak çalıştırmasına neden olur.
Daha fazla ayrıntıyı 6. Adım: Uygulama Bildirisi Oluşturma ve Gömme (UAC) (MSDN) bölümünde bulabilirsiniz .
Visual Studio 2008 üzerinde çalışırken, sağ tıklayın Project -> Add New Item
ve ardından seçin Application Manifest File
.
Manifest dosyasında etiketi bulacaksınız requestedExecutionLevel
ve 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.
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.
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.
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 false
kod 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);
}
runas
Yö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.
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 Settings
seç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.
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;
}
}
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.