C#

2010-03-28 10 views
63

içinde bir yönetici modu olarak bir işlem başlatmak için Visual Studio Windows uygulaması projem var. Bir yükleyici güncelleme dosyası indirmek için kod ekledim. Yüklemeyi bitirdikten sonra yükleyici, çalıştırmak için yönetici ayrıcalıklarına ihtiyaç duyacaktır. Bir manifesto dosyası ekledim.C#

Kullanıcı DownloadUpdate.exe'yi tıklattığında, UAC kullanıcıdan Yönetici izinlerini ister. Bu yüzden DownloadUpdate.exe içinde oluşturulan ve çağrılan tüm süreçlerin yönetici kapasitesinde çalışacağını varsaydım.

Process p = new Process(); 
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
p.StartInfo.FileName = strFile; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.RedirectStandardError = true; 
+1

Hayır, DownloadUpdater.exe'den çalıştırılan tüm işlemlerin yönetici modunda çalıştırıldığını varsaymazsınız. Aslında, bu korkunç bir güvenlik ihlali olurdu. Yönetici haklarına ihtiyaç duyan başka bir işlem çalıştırırsanız, kullanıcı tekrar sorulur. –

cevap

63

bu deneyin:

//Vista or higher check 
if (System.Environment.OSVersion.Version.Major >= 6) 
{ 
    p.StartInfo.Verb = "runas"; 
} 

Alternatif go the manifest route for your application yüzden kurulum aşağıdaki kodu ile benim indirilen dosyayı çağırmak yaptı. ProcessStartInfo ile de

+0

benim için çalışıyor! –

13
var pass = new SecureString(); 
pass.AppendChar('s'); 
pass.AppendChar('e'); 
pass.AppendChar('c'); 
pass.AppendChar('r'); 
pass.AppendChar('e'); 
pass.AppendChar('t'); 
Process.Start("notepad", "admin", pass, ""); 

İşleri: Bunu denemek zaman

var psi = new ProcessStartInfo 
{ 
    FileName = "notepad", 
    UserName = "admin", 
    Domain = "", 
    Password = pass, 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    RedirectStandardError = true 
}; 
Process.Start(psi); 
+3

Tamam, ama neden AppendChar kullanıyorsunuz? "Pass =" secret "' yazamaz mısın? – Jet

+13

Cauz bir sır değildi – Sayka

+5

@Jet hayır bir stringest değil bir dizge alır ve hiçbir zaman şifrelenmiş parola –

17

Bu çalışır. İki örnek programları ile iki kez kontrol:

System.UnauthorizedAccessException: yoluna Erişim 'c: \

using System; 
using System.Diagnostics; 

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     Process.Start("ConsoleApplication2.exe"); 
    } 
    } 
} 

using System; 
using System.IO; 

namespace ConsoleApplication2 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     File.WriteAllText(@"c:\program files\test.txt", "hello world"); 
     } 
     catch (Exception ex) { 
     Console.WriteLine(ex.ToString()); 
     Console.ReadLine(); 
     } 
    } 
    } 
} 

Önce UAC bombayı almak doğruladıktan dosyaları \ test.txt 'reddedildi.
// vb ..

Sonra cümle ile ConsoleApplication1 için bir bildirim eklendi:

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

bomba yok. Ve kolayca silemediğim bir dosya :) Bu, Vista ve Win7'yi çalıştıran çeşitli makinelerde önceki birkaç testle tutarlı. Başlatılan program, başlangıç ​​programından güvenlik belirtecini devralır. Başlangıç, yönetici ayrıcalıkları kazanmışsa, başlangıç ​​programı da bunlara sahiptir.

+0

Silinemiyor mu? Lütfen detaylandırın, bu tanıdık geliyor. –

+0

Çok teşekkürler! Bu bana çok yardımcı oldu. Get +1 – Jet

+0

@ArlenBeiler: Muhtemelen uygulamada, bir .exe.manifest dosyasına karşı yürütülebilir dosyaya yan yana diskte gömülü bir bildirim demektir. –

15

Bu sorunun net cevabı: How do I force my .NET application to run as administrator?

Özet:

Sağ proje tıklayın - Yeni öğe ekle> -> Uygulama Manifest Dosyası

Sonra bu dosyada bir satır değiştirmek böyle:

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

derleme ve koş!

+1

Gördüğünüz gibi, bu satır @Hans Passant'ın cevabına dahil edildi. Ancak programın başka bir program başlattığı her zaman sadece bu satır UAC penceresini açar mı? – Jet

0

Büyük olasılıkla uygulamanızı bir x64 uygulaması olarak ayarlamanız gerekir.

IIS Snap In yalnızca 64 bit çalışır ve 32 bit çalışmaz ve 32 bit uygulamadan oluşan bir işlem 32 bitlik bir işlem olarak çalışır ve aynı 64 bit uygulamalar için geçerli gibi görünüyor.En

Görünüş: Burada Start process as 64 bit

4

İstemi Windows olmadan yönetici olarak çalıştırın sürecinin bir örnektir

projenizde Bundan sonra

using System.Diagnostics; 

eklemeniz gerekir her şeyden

Process p = new Process(); 
    p.StartInfo.FileName = Server.MapPath("process.exe"); 
    p.StartInfo.Arguments = ""; 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.Verb = "runas"; 
    p.Start(); 
    p.WaitForExit(); 
+0

Bu benim sorunumu çözdü! Bu bilgi başkalarının cevaplarından gelir. UseShellExecute, CreateNoWindow ve RedirectStandardOutput kombinasyonu benim için bunu durdurdu. –

+0

Bu, Yönetici olarak çalışmıyor. Bir manifesto eklerseniz ve yükseltilmiş izinler isterseniz, yine de işe yaramaz. – MtnManChris

13

İlk Kullanmak istediğiniz farklı .exe dosyaları için kullanabileceğiniz genel bir yöntem yazabilirsiniz. Aşağıda gibi olacaktır:

public void ExecuteAsAdmin(string fileName) 
     { 
      Process proc = new Process(); 
      proc.StartInfo.FileName = fileName; 
      proc.StartInfo.UseShellExecute = true; 
      proc.StartInfo.Verb = "runas"; 
      proc.Start(); 
     } 

sonra tek yapmanız Bu yöntemi çağırmak olduğunu, örneğin notepad.exe çalıştırmak isterseniz:

ExecuteAsAdmin("notepad.exe"); 
0

bu yöntemi kullanın:

public static int RunProcessAsAdmin(string exeName, string parameters) 
    { 
     try { 
      System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
      startInfo.UseShellExecute = true; 
      startInfo.WorkingDirectory = CurrentDirectory; 
      startInfo.FileName = Path.Combine(CurrentDirectory, exeName); 
      startInfo.Verb = "runas"; 
      //MLHIDE 
      startInfo.Arguments = parameters; 
      startInfo.ErrorDialog = true; 

      Process process = System.Diagnostics.Process.Start(startInfo); 
      process.WaitForExit(); 
      return process.ExitCode; 
     } catch (Win32Exception ex) { 
      WriteLog(ex); 
      switch (ex.NativeErrorCode) { 
       case 1223: 
        return ex.NativeErrorCode; 
       default: 
        return ErrorReturnInteger; 
      } 

     } catch (Exception ex) { 
      WriteLog(ex); 
      return ErrorReturnInteger; 
     } 
    } 

Umarım yardımcı olur.

0
Process proc = new Process();                
        ProcessStartInfo info = 
        new ProcessStartInfo("Your Process name".exe, "Arguments"); 
        info.WindowStyle = ProcessWindowStyle.Hidden; 
        info.UseShellExecute =true; 
        info.Verb ="runas"; 
        proc.StartInfo = info; 
        proc.Start(); 
+0

"Argümanlar", ProcessStartInfo'da zorunlu değildir, yalnızca işlemi başlatmak için işlem adı yeterlidir. –