Comment faire pour exécuter des scripts PowerShell à partir de C#
Je suis en train d'exécuter un script PowerShell avec le C#, mais je n'ai pas de succès. Voici ma fonction:
private void ExecutePowerShellCommand(string scriptfile)
{
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke();
scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
Pipeline pipeline = runspace.CreatePipeline();
//Here's how you add a new script with arguments
Command myCommand = new Command(scriptfile);
//CommandParameter testParam = new CommandParameter("key", "value");
//myCommand.Parameters.Add(testParam);
pipeline.Commands.Add(myCommand);
//Execute PowerShell script
pipeline.Invoke();
}
C'est l'erreur que je reçois:
L'accès à la clé de registre " HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell " est refusé.
Comment puis-je résoudre ce problème? J'ai vu des idées pour usurpation d'identité, mais je n'ai pas l'air de trouver tout de bons exemples à imiter. Je voudrais lancer ce script en tant qu'administrateur.
J'ai fait les déclarations suivantes:
[DllImport("advapi32.dll")]
private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr handle);
public delegate void IncognitoDelegate(params object[] args);
J'ai créé la fonction suivante pour usurpation d'identité:
public static void Impersonate(IncognitoDelegate incognitoDelegate, params object[] args)
{
System.IntPtr token = new IntPtr();
WindowsIdentity wi;
if (LogonUser("myusername", "", "mypassword", 8, 0, ref token))
{
wi = new WindowsIdentity(token);
WindowsImpersonationContext wic = wi.Impersonate();
incognitoDelegate(args);
wic.Undo();
}
CloseHandle(token);
}
J'ai créé une fonction qui est utilisée en tant que délégué:
private static void GIncognito(params object[] args)
{
RunspaceInvoke scriptInvoker = new RunspaceInvoke();
scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
}
Et j'ai modifié ma méthode:
private void ExecutePowerShellCommand(string scriptfile)
{
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
Impersonate(new Util.IncognitoDelegate(GIncognito));
//RunspaceInvoke scriptInvoker = new RunspaceInvoke();
//scriptInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
Pipeline pipeline = runspace.CreatePipeline();
//Here's how you add a new script with arguments
Command myCommand = new Command(scriptfile);
//CommandParameter testParam = new CommandParameter("key", "value");
//myCommand.Parameters.Add(testParam);
pipeline.Commands.Add(myCommand);
//Execute PowerShell script
pipeline.Invoke();
}
Le résultat a été...
... le très sam erreur, me disant que je ne peux pas accéder à des clés de registre.
l'usurpation d'identité est beaucoup trop pour cela... tout ce que vous devez faire est de changer le champ d'application que le
Set-ExecutionPolicy
utilise... voir ma réponse ci-dessous.
OriginalL'auteur Lajos Arpad | 2012-11-20
Vous devez vous connecter pour publier un commentaire.
La valeur par défaut
Set-ExecutionPolicy
commande tente de mettre la machine à l'échelle de valeur. Vous souhaitez modifier le paramètre dans le champ d'application de votre application en C#, vous devez ajouter le-Scope Process
option à la commande.À l'aide de
Get-Help Set-ExecutionPolicy -detailed
révèle cette information:... et il décrit également les
-Scope
option.Cela a l'avantage de seulement impact sur la politique d'exécution pour l'exécution des scripts à partir de votre application en C#, et il n'est pas inutilement changement de la politique d'exécution par défaut PowerShell comportement. (De sorte qu'il est beaucoup plus sûr, surtout si vous pouvez donner des garanties quant à la validité des scripts de votre application s'exécute.)
OriginalL'auteur JaredReisinger
Ici est la méthode b, qui ne nécessite pas de droits élevés ou
Modification du registre des droits.
À l'aide de
Process.Start
le lancement de cette et ajoutez le initiale-command
ou-file
args.Ici est une autre technique, http://dmitrysotnikov.wordpress.com/2008/06/27/powershell-script-in-a-bat-file/
Qui s'appuie sur la mise en œuvre par l'encodage d'abord et en passant int par le biais de la
-EncodedCommand
arg de powershell.exe qui apparaît pour contourner la politique d'exécution.git vous demande un nom d'utilisateur mot de passe ou windows? Ce qui est dans votre fichier?
cd mylocation\r\nngit pull\r\ngit sous-module de mise à jour
git est hors de ma gamme de l'expérience. Je devine que vous êtes l'obtention invité par git pour les informations d'identification, peut-être que ce sera vous aider: superuser.com/questions/338511/...
J'ai édité ma question. J'ai essayé de mettre en œuvre une méthode d'usurper l'identité d'. Je ne sais pas ce qui est mal, mais quelque chose est certainement pas droit.
OriginalL'auteur MatthewMartin
Vous pouvez essayer quelque chose comme ce qui suit
Voici un lien que vous pouvez regarder pour vous faire une idée par exemple, Classe Pour usurper l'identité d'un Utilisateur.
Ressemble à ce code: stackoverflow.com/questions/9909784/c-sharp-impersonator
Découvrez le lien que Matthieu Martin a posté aussi j'espère que cette information aide à obtenir commencé voici le lien que j'ai posté aussi bien dans le cas où il ne fonctionne pas à partir de mon post initial codeproject.com/Articles/10090/...
Ok, maintenant j'ai l'erreur suivante: Demande d'accès au registre n'est pas autorisé.
avez-vous les bonnes permissions / droits pour exécuter un script powershell..?
OriginalL'auteur MethodMan