Я пытаюсь выполнить PowerShell script из приложения С#. script должен выполняться в специальном пользовательском контексте.
Я пробовал разные сценарии, некоторые из них работают не так:
1. прямой вызов из PowerShell
Я вызвал script непосредственно из ps-консоли, которая работает под правильными usercredentials.
C:\Scripts\GroupNewGroup.ps1 1
Результат: Успешно выполняется script.
2. из консольного приложения С#
Я вызвал script из консольного приложения С#, которое запускается под правильными usercredentials.
Код:
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();
}
}
Результат: Нет успеха. И много исключений "Null-Array".
3. из приложения консоли С# - код, выдающий себя за
(http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials)
Я вызвал script из c_конфигурации С#, которая запускается под правильными usercredentials, а код содержит олицетворение.
код:
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();
}
}
}
Результаты:
- Термин Get-Contact не распознается как имя командлета, функция, файл script или операционная программа. Проверьте правильность написания имя, или если путь был включен, убедитесь, что путь правильный и повторите попытку.
- Термин 'C:\Scripts\FunctionsObjects.ps1' не распознается как имя командлета, функция, файл script или операционная программа. Проверьте написание имени, или если путь был включен, убедитесь, что путь правильный и повторите попытку.
- Никаких оснасток не было зарегистрировано для Windows PowerShell версии 2. Microsoft.Office.Server, Version = 14.0.0.0, Culture = нейтральный, PublicKeyToken = 71e9bce111e9429c
- System.DirectoryServices.AccountManagement, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089
- Вызов вызова ".ctor" с аргументом "1": "Веб-приложение
в
http://XXXX/websites/Test4/
не удалось найти. Убедитесь, что вы правильно напечатали URL. Если URL должен обслуживать существующие контента, системному администратору может потребоваться добавить новый URL-адрес запроса сопоставление с предполагаемым приложением ". - Вы не можете вызывать метод с нулевым значением. Нельзя индексировать в нулевой массив.
До сих пор нет рабочего ответа
Кто-нибудь знает, почему существуют различия и как решить проблему?