2011-12-31 24 views
5

Aşağıdaki kod ile bir cmd komutunu çalıştırmak çalışıyorum: Ben yönetici olarak cmd çalıştırmak ve mükemmel çalışıyor ama koşamam zaman komutu yazın Bu komut, yönetici privelages gerektirir Run yükselmiş süreç

ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe"); 
cmd.RedirectStandardInput = true; 
cmd.RedirectStandardOutput = true; 
cmd.RedirectStandardError = true; 
cmd.UseShellExecute = false; 
cmd.CreateNoWindow = true; 
cmd.WindowStyle = ProcessWindowStyle.Hidden; 
Process exec = Process.Start(cmd); 
exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory()); 

Bu uygulama admin olarak. Ben UAC exe her açtığınızda isteyen bir bildirim dosyasına

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

ekledik.

Bu konuyla ilgili birden fazla soru gördüm ve bunların hepsi, yüksek bir uygulama altında çalışan herhangi bir işlemin aynı haklara sahip olacağını önermektedir, ancak bu benim için çalışmıyor.

cmd.Verb = "runas";'u denedim, ancak hiçbir zar.

+0

değiştirmeyi deneyin 'cmd.UseShellExecute' için' TRUE ve 'runas' fiil tutun. – keyboardP

+0

Sadece denedim, ancak bu hatayı aldım. İşlem nesnesinin IO akışlarını yeniden yönlendirmek için UseShellExecute özelliği false olarak ayarlanmış olması gerekir. –

+4

Paranın durduğu yer burası, iki yönden de olamaz. UAC, ayrılmamış bir sürecin yükseltilmiş olanın yeteneklerini hi-jacking etmesini önler. Yönlendirebilmenin tek yolu, önce kendini yükseltmektir. –

cevap

13

Sen saygı Verb için true için UseShellExecute ayarlamanız gerekir ve standart çıktıyı yönlendirmek için 'false' olarak ayarlanmalıdır. İkisini de yapamazsın.

Eminim Windows ayrıca, yönetici/yönetici olmayan güvenlik sınırı boyunca standart giriş/çıkış/hatayı yeniden yönlendirmenize izin vermeyecektir. Yönetici olarak çalışan programdan çıktı almak için farklı bir yol bulmanız gerekecek.

Bu makaleyi okumadım, ama bu size daha fazla bilgi verebilir: http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

+0

UseShellExecute = false; kullanmayı deniyorum Fiil = "runas"; RedirectStandardInput = true; Alan = du [0]; UserName = UserAdministrator; Parola = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; Ve manifest'te requestedExecutionLevel kullanılıyor. UseShellExecute = true kullanırsam; Hata alıyorum İşlem nesnesinin bir işlemi kullanıcı olarak başlatmak için UseShellExecute özelliği false olarak ayarlanmış olması gerekir. – Kiquenet

+0

Tam örnek, programın yönetici olarak çalışmasını sağlamak için farklı bir yol mu? – Kiquenet

2

ProcessStartInfo nesnesine yönetimsel kimlik atamayı denediniz mi?

SecureString password = new SecureString(); 
password.AppendChar('p'); 
password.AppendChar('w'); 
cmd.UserName = "admin"; 
cmd.Password = password; 
+0

Bunu yapmak için UAC'ye ihtiyaç duyduğumdan, bunu birden fazla PC'de kullanacağından istemek için yapamam. –

+0

Tamam, mantıklı. Bana neden bir komut süreci oluşturduğunuzu ve "sc" komutunu doğrudan çalıştırdıktan sonra "sc" i çalıştırmaya yönlendirdiğini söyleyebilir misiniz? – Abbas

+0

Sc komutunu, kullanıcı sc'yi nasıl kullanacağını bilmeyeceği için bir winformdaki bir düğmeyle çalıştırmaya çalışıyorum, sadece programı kullanmasını kolaylaştırmak için. –