Próbuję wykonać skrypt PowerShell z aplikacji C#. Skrypt musi zostać wykonany w specjalnym tekście użytkownika.Uruchom PowerShell-Script z aplikacji C#
próbowałem różne scenariusze niektórzy pracują niektóre nie:
1. Bezpośrednie połączenie z PowerShell
Zadzwoniłem skrypt bezpośrednio z ps-konsoli, który jest uruchomiony pod prawidłowa Poświadczenia użytkownika.
C:\Scripts\GroupNewGroup.ps1 1
Wynik: pomyślnie uruchomiony skrypt.
2. z aplikacji konsoli C#
Mam nazwie skrypt z C# consoleapplication który rozpoczął się pod poprawnych usercredentials.
Kod:
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();
}
}
Wynik: bez powodzenia. I wiele wyjątków "Null-Array".
3. z aC# konsoli aplikacji - kod strony podszywania
(http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials)
Zadzwoniłem skrypt z aC# consoleapplication który rozpoczął się pod poprawnych usercredentials a kod zawiera personifikacji .
Kod:
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();
}
}
}
Wyniki:
- Termin 'Get-Contact' nie jest rozpoznawana jako nazwy apletu polecenia, funkcji, pliku skryptu lub program wykonywalny. Sprawdź pisownię nazwy lub, jeśli ścieżka została dołączona, sprawdź, czy ścieżka jest poprawna i spróbuj ponownie.
- Termin „C: \ Scripts \ FunctionsObjects.ps1” nie jest uznawane jako nazwy z apletu polecenia, funkcji skryptu lub program wykonywalny. Sprawdź pisownię nazwy lub, jeśli ścieżka została uwzględniona, sprawdź, czy ścieżka jest poprawna i spróbuj ponownie.
- Brak przystawki zostały zarejestrowane dla Windows PowerShell w wersji 2. Microsoft.Office.Server, Version = 14.0.0.0, Culture = neutral, TokenKluczaPublicznego = 71e9bce111e9429c
- System.DirectoryServices.AccountManagement, Version = 4,0. 0,0, Culture = neutral, TokenKluczaPublicznego = b77a5c561934e089
- Wyjątek wywołujący „.ctor” z «1» argumentu (ów):. „Aplikacja internetowa na
http://XXXX/websites/Test4/
nie można znaleźć Sprawdź, czy poprawnie wpisany URL.Jeśli adres URL należy obsługujących istniejące zawartości, administrator systemu może być konieczne, aby dodać nowy adres URL żądania mapowanie do zamierzonego zastosowania.” - Nie można wywołać metodę na wyrażeniu zerowej wycenione. Nie można Indeks do null tablicą.
do tej pory nie ma odpowiedzi roboczego
każdy ostateczne rozwiązanie z pełnym kodem źródłowym działa? – Kiquenet
Unikaj wywoływania [RunSpace.Open() podczas podszywania się] (http://stackoverflow.com/a/22749094/939250). –