Powershell выполняется от C# для управления группами ActiveDirectory - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь выполнить простой запрос в нашей AD из программы на C#, но всегда получаю ошибку «Не удается связаться с сервером», которую я не понимаю. Я думаю, это может быть связано с некоторыми правами, которые я пропускаю, но не могу выяснить или найти нужные мне права.

Это команда powershell

Remove-ADGroupMember -Identity "GrpLanguageFrench" -Members "MazMa" -Confirm:$false

Это C# код

InitialSessionState iss = InitialSessionState.CreateDefault();
string[] modules = { "activedirectory" };
iss.ImportPSModule(modules);


//Create PowerShell runspace
Runspace runspace = RunspaceFactory.CreateRunspace(iss);
runspace.Open();

Pipeline pipeline1 = runspace.CreatePipeline();
Command myCommandR1 = new Command("Remove-ADGroupMember");

myCommandR1.Parameters.Add("Identity", "GrpLanguageFrench");       
myCommandR1.Parameters.Add("Members", "MazMa");
myCommandR1.Parameters.Add("Confirm", false);

pipeline1.Commands.Add(myCommandR1);

try
{
   //execute script        
   pipeline1.Invoke();
 } catch (Exception e) {
   mw.WriteLog("Exception of type " + e.GetType().ToString() + " was thrown during execution of powershell command : " + e.Message);
   return;
 } finally {
   //close runspace
   runspace.Close();
 }

И вот моя среда возобновилась:

  • wind c => Контроллер домена
  • app => сервер, на котором c# приложение работает
  • admin => учетная запись администратора домена
  • appsuser => учетная запись, которая запускает приложение

Если я запускаю программу из приложения сервера Зарегистрировавшись как appsuser, я получаю следующую ошибку: Исключение типа System.Management.Automation.CmdletInvocationException возникло во время выполнения команды powershell: Невозможно связаться с сервером. Это может быть связано с тем, что этот сервер не существует, он в данный момент не работает или на нем не запущены веб-службы Active Directory.

Если я запускаю команду powershell непосредственно из серверного приложения, зарегистрированного как appsuser, он работает

Если я запускаю программу из серверного приложения, зарегистрированного как администратор, это работает => Это то, что заставляет меня думать, что это не связано с веб-службой AD или чем-то, что нужно установить (RSAT) в моем приложении сервер.

Это оставило бы только права, но тогда это не должно работать как appsuser в Powershell, так что ... Поэтому я застрял на данный момент, пытаясь выяснить, какие права отсутствуют в моей учетной записи для выполнения Powershell. Команды через код.

Ответы Габриэлю Люси:

Брандмауэр: Нет, и поскольку он работает непосредственно с powershell, я не верю, что что-то может блокировать пользователя на сетевом уровне (или не понимаю, как пройдет прямой Powershell)

Причина для этого: я унаследовал то, что было на месте, когда я приехал Ved, и у нас есть много программ, доступных для пользователей, не являющихся администраторами, для выполнения действий над AD (блокировка / разблокировка учетных записей, сброс паролей, изменение членства в группах и т. д. c ...). В настоящее время у пользователя, на котором работают все эти программы, слишком много привилегий (они могли бы изменить пароль администратора домена, если немного его обманули ... А так как мы школа ... Ну, мы до сих пор повезло!) И я пытаюсь настроить пользователя с минимальными правами, чтобы иметь возможность делать то, что он должен делать. Поэтому моя первоначальная цель состояла в том, чтобы заставить его работать, не затрагивая сами программы (поскольку они работают), но я должен признать, что ваше предложение кажется более практичным, чем попытка вызвать Powershell (старый «разработчик» не имел опыта программирования). так что, я думаю, он был более склонен к использованию Powershell, так как знал это). Я немного поищу и протестирую то, что вы предложили, по крайней мере, я надеюсь, что смогу получить более понятное сообщение об ошибке, чем «сервер не найден».

1 Ответ

0 голосов
/ 08 апреля 2020

У вас на компьютере работает брандмауэр, который блокирует доступ только для этого пользователя?

Кроме того, это разные учетные записи в разных доменах?

В качестве примечания: вызов PowerShell команды от C#, по моему опыту, больно. У тебя есть причина для этого? Или это единственный известный вам способ?

Это может быть гораздо проще сделать в C#, используя пространство имен System.DirectoryServices.AccountManagement (вам нужно будет добавить эту ссылку в ваш проект):

var ctx = new PrincipalContext(ContextType.Domain);
var group = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "GrpLanguageFrench");
group.Members.Remove(ctx, IdentityType.Name, "MazMa");

Это может не решить ваших проблем с сетью, но облегчит поддержку вашего кода.

...