Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#执行Powershell以管理ActiveDirectory组_C#_Powershell_Active Directory - Fatal编程技术网

从C#执行Powershell以管理ActiveDirectory组

从C#执行Powershell以管理ActiveDirectory组,c#,powershell,active-directory,C#,Powershell,Active Directory,我试图从C#中的一个程序在我们的广告中运行一个简单的查询,但我总是收到一个我不理解的“无法联系服务器”错误。我想这可能与我缺少的一些权利有关,但我无法找出或找到我需要的权利 这是powershell命令 Remove-ADGroupMember -Identity "GrpLanguageFrench" -Members "MazMa" -Confirm:$false 这是C代码 这就是我的环境: windc=>域控制器 app=>运行c#应用程序的服务器 admin=>域的管理员帐户 ap

我试图从C#中的一个程序在我们的广告中运行一个简单的查询,但我总是收到一个我不理解的“无法联系服务器”错误。我想这可能与我缺少的一些权利有关,但我无法找出或找到我需要的权利

这是powershell命令

Remove-ADGroupMember -Identity "GrpLanguageFrench" -Members "MazMa" -Confirm:$false
这是C代码

这就是我的环境:

  • windc=>域控制器
  • app=>运行c#应用程序的服务器
  • admin=>域的管理员帐户
  • appsuser=>运行应用程序的帐户
如果我从记录为appsuser的服务器应用程序运行该程序,则会出现以下错误: 在执行powershell命令期间引发System.Management.Automation.CmdleInvocationException类型的异常:无法联系服务器。这可能是因为此服务器不存在、当前已关闭或没有运行Active Directory Web服务

如果我直接从记录为appsuser的服务器应用程序运行powershell命令,它会工作

如果我从以管理员身份登录的服务器应用程序运行该程序,它会运行=>这就是我认为它与AD Web服务无关的地方,或者与我的应用程序服务器上要安装的任何东西(RSAT)无关的地方

这将只留下权限,但它也不应该在Powershell中作为appsuser工作。。。因此,我暂时无法确定我的帐户缺少通过代码执行Powershell命令的哪些权限

对Gabriel Luci的答复:

防火墙:没有,而且由于它直接从powershell工作,我不相信有什么东西可能会在网络级别阻止用户(或者看不到direct powershell将如何通过)

这样做的原因:我继承了我到达时的做法,我们有很多程序可供非管理员用户以某种方式对广告进行操作(锁定/解锁帐户、重置密码、更改组成员身份等)。目前,所有这些程序都在运行的witch上的用户拥有太多的权限(如果他们有点欺骗的话,他们可能会更改域管理员的密码……而且因为我们是一所学校……好吧,到目前为止,我们很幸运!)。我正试图建立一个拥有最低权限的用户,让他能够做他应该做的事情。 因此,我最初的目标是在不涉及程序本身的情况下使其工作(因为它们可以工作),但我必须承认,您的建议似乎比尝试调用Powershell更实际(老“开发人员”没有任何编程背景,因此我猜他更倾向于使用Powershell,因为他知道这一点)。
我会搜索一下并测试一下你的建议,至少我希望我能得到一条比“找不到服务器”更清晰的错误消息。

你的计算机上是否有防火墙,只阻止该用户访问

另外,这些不同的帐户在不同的域上吗

顺便说一句:根据我的经验,从C#调用PowerShell命令是很痛苦的。你有这样做的理由吗?或者这只是你知道的唯一方式

使用
System.DirectoryServices.AccountManagement
名称空间(您必须将该引用添加到您的项目中),在C#中实现这一点要容易得多:

var ctx=新的PrincipalContext(ContextType.Domain);
var group=GroupPrincipal.FindByIdentity(ctx,IdentityType.Name,“GrpLanguageFrench”);
删除(ctx,IdentityType.Name,“MazMa”);

这可能无法解决您的网络问题,但会使您的代码更易于维护。

您的计算机上是否有防火墙,只阻止该用户访问

另外,这些不同的帐户在不同的域上吗

顺便说一句:根据我的经验,从C#调用PowerShell命令是很痛苦的。你有这样做的理由吗?或者这只是你知道的唯一方式

使用
System.DirectoryServices.AccountManagement
名称空间(您必须将该引用添加到您的项目中),在C#中实现这一点要容易得多:

var ctx=新的PrincipalContext(ContextType.Domain);
var group=GroupPrincipal.FindByIdentity(ctx,IdentityType.Name,“GrpLanguageFrench”);
删除(ctx,IdentityType.Name,“MazMa”);

这可能无法解决您的网络问题,但会使您的代码更易于维护。

我已经测试了您的代码,现在错误是System.DirectoryServices.Protocols.LdapeException,消息为:无法建立连接计算机位于域中,并且是System.Security.Principal.WindowsIdentity.GetCurrent().Name为我提供了域\用户名,正如我所期望的那样。您的所有帐户是否都在同一个域上?(默认情况下,它连接到用户的域)您可以尝试使用查看它尝试连接到的IP(右键单击进程->属性->TCP/IP选项卡)是的,所有内容都在同一个域上。如果我使用process explorer进行检查,则appsuser的TCP/IP选项卡中不会显示任何内容。如果我对老用户做同样的测试,我的DC的名称显示正确(测试在同一台机器上完成)是的,这让我觉得它是你计算机上的软件防火墙。Windows防火墙正在运行吗?或者你有内置防火墙的防病毒软件吗?Windows防火墙是打开的,但我把它关掉了,问题仍然是一样的(但它也为工作正常的用户打开)。除Windows Defender外,没有其他防病毒软件。我已经测试了您的代码,现在错误是System.DirectoryServices.Protocols.LdapeException,并显示以下消息:无法建立连接计算机位于域中,以及System.Security.Principal.WindowsIdentity.GetCurrent().Name为我提供了域\用户名,正如我所期望的那样。您的所有帐户是否都在同一个域上?(默认情况下,它连接到用户的域)您可以尝试使用查看它尝试连接到的IP(右键单击进程->属性->TCP/IP选项卡)是的,所有内容都在s上
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();
 }