从C#执行Powershell以管理ActiveDirectory组
我试图从C#中的一个程序在我们的广告中运行一个简单的查询,但我总是收到一个我不理解的“无法联系服务器”错误。我想这可能与我缺少的一些权利有关,但我无法找出或找到我需要的权利 这是powershell命令从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
Remove-ADGroupMember -Identity "GrpLanguageFrench" -Members "MazMa" -Confirm:$false
这是C代码
这就是我的环境:
- windc=>域控制器
- app=>运行c#应用程序的服务器
- admin=>域的管理员帐户
- appsuser=>运行应用程序的帐户
我会搜索一下并测试一下你的建议,至少我希望我能得到一条比“找不到服务器”更清晰的错误消息。你的计算机上是否有防火墙,只阻止该用户访问 另外,这些不同的帐户在不同的域上吗 顺便说一句:根据我的经验,从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();
}