2012-12-10 13 views
6

Jak uruchomić komendę **cd..** za kulisami formularza systemu Windows? (tj. użytkownik nie może tego zobaczyć)Uruchamianie poleceń cmd z prawami administratora

Dzięki.

+0

Należy robić rzeczy bezpośrednio w C# zamiast. – SLaks

+0

Tutaj znajdziesz pomocne informacje http://stackoverflow.com/questions/7610727/to-run-cmd-as-administrator-zalecenia-z poleceniem – Vlad

Odpowiedz

8

See System.Diagnostics.Process http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

Jest to również odpowiedź na SO tym samym dokładnym pytanie:https://stackoverflow.com/a/1469790/25882

Przykład:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg"; 
startInfo.Verb = "runas"; 
process.StartInfo = startInfo; 
process.Start(); 
+0

isnt/c argumenty command i/b lub jestem w błędzie – NathanProgrammer

+0

@ Kid8/b jest argumentem dla polecenia kopiowania. Wszystko na prawo od/C jest ciągiem poleceń. –

+1

Upewnij się także, że nie ustawiłeś UseShellExecute na false – kofifus

0

Fragment jest „niewidoczny "do użytkownika, a także przekierowuje dane wyjściowe, dzięki czemu można go w jakiś sposób użyć (prawdopodobnie jest to potrzebne).

string output = null; 

try 
{ 
    ProcessStartInfo ps = new ProcessStartInfo("cmd"); 
    ps.Arguments = "/c cd.."; 
    ps.UseShellExecute = false; 

    // Redirects the standard output so it reads internally in out program 
    ps.RedirectStandardOutput = true; 

    // Starts the process 
    using (Process p = Process.Start(ps)) 
    { 
     // Reads the output to a string 
     output = p.StandardOutput.ReadToEnd(); 

     // Waits for the process to exit must come *after* StandardOutput is "empty" 
     // so that we don't deadlock because the intermediate kernel pipe is full. 
     p.WaitForExit(); 
    } 
} 
catch 
{ 
    // manage errors 
} 
finally 
{ 
if(output != null) 
{ 
    // Process your output 
} 
} 
12

może zainicjować nową System.Diagnostics.ProcessStartInfo który posiada informacje wymagane dla danego procesu, aby rozpocząć oprócz WindowStyle który wskazuje stan okna w użyciu, gdy proces jest uruchomiony, które mogą być Hidden, Maximized, Minimized lub Normal. W twoim przypadku ustawimy to jako Hidden, aby proces, który zostanie uruchomiony, nie był w stanie odebrać ani wejścia, ani pokazać wyjścia/użytkownikowi.

Przykład

System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); //Initializes a new ProcessStartInfo of name myProcessInfo 
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; //Sets the FileName property of myProcessInfo to %SystemRoot%\System32\cmd.exe where %SystemRoot% is a system variable which is expanded using Environment.ExpandEnvironmentVariables 
myProcessInfo.Arguments = "cd.."; //Sets the arguments to cd.. 
myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Sets the WindowStyle of myProcessInfo which indicates the window state to use when the process is started to Hidden 
System.Diagnostics.Process.Start(myProcessInfo); //Starts the process based on myProcessInfo 

ekranu

Poniżej ekranu przedstawia menedżer Zadanie pokazujący proces, który został uruchomiony w naszym zgłoszeniu. Jednak jego okno nie jest widoczne.

The process is running without showing its Window

Wskazówka: Proces rozpoczął nie wygasa nawet po zamknięciu aplikacji.

Dodatkowo, aby uruchomić proces jako administrator może ustawić właściwość procesu Verb rozpocząć informacji do runas

Przykład

System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); //Initializes a new ProcessStartInfo of name myProcessInfo 
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; //Sets the FileName property of myProcessInfo to %SystemRoot%\System32\cmd.exe where %SystemRoot% is a system variable which is expanded using Environment.ExpandEnvironmentVariables 
myProcessInfo.Arguments = "cd.."; //Sets the arguments to cd.. 
myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Sets the WindowStyle of myProcessInfo which indicates the window state to use when the process is started to Hidden 
myProcessInfo.Verb = "runas"; //The process should start with elevated permissions 
System.Diagnostics.Process.Start(myProcessInfo); //Starts the process based on myProcessInfo 

Zawiadomienie: Jeśli masz konto użytkownika Po włączeniu kontroli możesz zostać poproszony o zezwolenie procesowi na rozpoczęcie z podwyższonymi uprawnieniami, jeśli aplikacja, która próbowała wywołać ten proces, nie działała z podwyższonymi uprawnieniami.

Jeśli chcesz pominąć monit, myślę, że powinieneś zezwolić głównej aplikacji na rozpoczęcie z podwyższonymi uprawnieniami. Aby to zrobić, musisz otworzyć okaż aplikacji i upewnij się, że dodaje się następujący wiersz

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

To będzie po prostu powiedzieć, aby rozpocząć swoją aplikację tylko z podwyższonymi uprawnieniami.Tak więc, gdy wywołasz proces jako administrator, nie będzie żadnego monitu, ponieważ wywoływacz procesu jest wykonywany przez administratora.

Dzięki,
Mam nadzieję, że to pomocny :)

+0

nie zapomnij o '/ C' przy argumentach – newbieguy

Powiązane problemy