2015-11-03 1 views
2
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Diagnostics; 


namespace WindowsFormsApplication 
{ 
    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var newProcessInfo = new System.Diagnostics.ProcessStartInfo(); 
      newProcessInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"; 
      newProcessInfo.Verb = "runas"; 
      System.Diagnostics.Process.Start(newProcessInfo); 
      newProcessInfo.Arguments = @"sfc /scannow"; 
     } 
    } 
} 

Donc, mon code fonctionne jusqu'à un certain point. vous cliquez sur le bouton de l'application du formulaire Windows et il va exécuter windows Powershell en 64bit en tant qu'administrateur mais ne va pas exécuter un script .ps1 "c: \ path \ script.ps1" ou la commande directement écrite comme le "sfc/scannow" au dessus.Exécutez une commande Powershell en tant qu'administrateur - Commandes elle-même ne se chargera pas

Je lisais que les commandes powershell ne fonctionneront pas parfois si le "Set-ExecutionPolicy Unrestricted" n'est pas chargé quelque part au début du code.

Aidez s'il vous plaît! J'ai cherché partout une réponse.

+0

'[...] \ SysWOW64 \ [...] \ powershell.exe' est * 32-bit * powershell –

+0

pourquoi n'exécutez-vous pas la commande sans powershell? –

+0

C'était juste un exemple. J'utiliserai réellement les commandes de Powershell pour une partie de la programmation. Alors, quel dossier est le PowerShell 64 bits si celui-ci n'est pas correct. le SysWOW64 devrait être toute la version 64 bits du système Windows. – DDJ

Répondre

1

Tout d'abord, vous devez spécifier la Arguments propriété avant commencer le processus:

var newProcessInfo = new System.Diagnostics.ProcessStartInfo(); 
newProcessInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"; 
newProcessInfo.Verb = "runas"; 
newProcessInfo.Arguments = @"sfc /scannow"; 
System.Diagnostics.Process.Start(newProcessInfo); 

Deuxièmement, vous aurez besoin de dire PowerShell que sfc /scannow est une commande, et ne commande pas les commutateurs de ligne .

Sur la ligne de commande que vous feriez powershell.exe -Command "sfc /scannow", la valeur Arguments correcte dans votre cas serait

newProcessInfo.Arguments = @"-Command ""sfc /scannow"""; 

("" est la séquence d'échappement pour " dans des chaînes verbatim)

Pour .ps1 fichiers , utilisez le commutateur -File:

newProcessInfo.Arguments = @"-File ""C:\my\script.ps1"""; 

Si vous ne connaissez pas la politique d'exécution sur le système cible, vous pouvez le contourner sans affecter la politique de la machine à l'échelle avec -ExecutionPolicy Bypass:

newProcessInfo.Arguments = @"–ExecutionPolicy Bypass -File ""C:\my\script.ps1"""; 
+0

Merci pour toutes vos connaissances! Cela m'a vraiment aidé. :) – DDJ