Sto provando a eseguire uno script PowerShell da un'applicazione C#. Lo script deve essere eseguito in uno speciale contesto utente.Eseguire PowerShell-Script dall'applicazione C#
Ho provato diversi scenari alcuni stanno lavorando alcuni non:
1. chiamata diretta da PowerShell
ho chiamato lo script direttamente da una ps-console che viene eseguito con la corretta UserCredentials.
C:\Scripts\GroupNewGroup.ps1 1
Risultato: in esecuzione con successo lo script.
2. da un'applicazione C# console
ho chiamato lo script da un C# ConsoleApplication che è iniziato sotto i UserCredentials corrette.
Codice:
string cmdArg = "C:\\Scripts\\GroupNewGroup.ps1 1"
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(cmdArg);
pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
Collection<PSObject> results = pipeline.Invoke();
var error = pipeline.Error.ReadToEnd();
runspace.Close();
if (error.Count >= 1)
{
string errors = "";
foreach (var Error in error)
{
errors = errors + " " + Error.ToString();
}
}
Risultato: senza successo. E un sacco di eccezioni "Null-Array".
3. AC# applicazione console - codice lato impersonare
(http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials)
ho chiamato lo script da corrente alternata # ConsoleApplication che è iniziato sotto i UserCredentials corretti e il codice contiene la rappresentazione .
Codice:
using (new Impersonator("Administrator2", "domain", "testPW"))
{
using (RunspaceInvoke invoker = new RunspaceInvoke())
{
invoker.Invoke("Set-ExecutionPolicy Unrestricted");
}
string cmdArg = "C:\\Scripts\\GroupNewGroup.ps1 1";
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(cmdArg);
pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
Collection<PSObject> results = pipeline.Invoke();
var error = pipeline.Error.ReadToEnd();
runspace.Close();
if (error.Count >= 1)
{
string errors = "";
foreach (var Error in error)
{
errors = errors + " " + Error.ToString();
}
}
}
Risultati:
- Il termine 'Get-Contact' non è riconosciuto come il nome di un cmdlet, funzione, file di script o un programma eseguibile. Controllare l'ortografia del nome o se è stato incluso un percorso, verificare che il percorso sia corretto e riprovare con .
- Il termine "C: \ Scripts \ FunctionsObjects.ps1" non è riconosciuto come il nome di un cmdlet, una funzione, un file di script o un programma eseguibile. Controllare l'ortografia del nome, o se è stato incluso un percorso, verificare che il percorso sia corretto e riprovare.
- Non snap-in sono stati registrati per Windows PowerShell versione 2. Microsoft.Office.Server, Version = 14.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c
- System.DirectoryServices.AccountManagement, Version = 4.0. 0.0, Lingua = il neutro PublicKeyToken = b77a5c561934e089
- Eccezione chiamata ".ctor" con l'argomento "1" (s):. "l'applicazione Web a
http://XXXX/websites/Test4/
non è stato trovato Verificare di stato digitato correttamente l'URL.Se l'URL deve essere al servizio contenuto esistente, l'amministratore di sistema potrebbe essere necessario aggiungere un nuovo mapping richiesta URL per l'applicazione prevista." - Non è possibile chiamare un metodo su un'espressione null-valore. Impossibile indice in un nulla array.
Fino ad ora non v'è alcuna risposta operaia
qualcuno sa perché ci sono differenze e come risolvere il problema?
qualsiasi soluzione finale con il codice sorgente completo di lavoro? – Kiquenet
Evita di chiamare [RunSpace.Open() mentre impersona] (http://stackoverflow.com/a/22749094/939250). –