DirectoryServices.AccountManagement.PrincipalContext是否可以在远程Win 2012 R2服务器上运行?

时间:2017-08-19 14:02:05

标签: account-management

这是我的方案,到目前为止我还没有找到解决方法:该应用程序在Windows 2012 R2服务器(svr1,域成员)上运行,并且需要将域帐户添加到svr2上的本地组,也是域名成员。

到目前为止,使用ADSI对我没有用(仍在尝试)。 PSEXEC不是一种选择,因为通过网络发送明文凭证。

此行适用于远程Windows 2008 R2服务器,而不适用于远程Windows 2012 R2服务器,因为ConnectedServer属性会抛出“System.UnauthorizedAccessException”,但仅限于访问2012 R2服务器时。凭据是有效的域管理员信用(适用于2008 R2,我可以使用它们登录到开发服务器)

    using ( PrincipalContext adDestMachinePrincContext = new PrincipalContext( AccountManagement.ContextType.Machine,"svr2",null,ada.ContextOptions.Negotiate,
"DomainName\\TheDomainAdminAccount","LegitPassword" ) )  
{  ... etc etc etc ... }

到目前为止我发现的是:

  1. 凭据有效,因为同一行适用于远程2008 R2服务器。
  2. 远程2012 R2是我的问题所在,我没有 测试2016年了。
  3. 当我登录开发服务器时 使用相同的域管理员凭据,它适用于当前 使用用户的凭据。这条线路每次都适用 当前用户是相同的域管理员

    PrincipalContext x = new ada.PrincipalContext(AccountManagement.ContextType.Machine,“svr2”);

  4. 目标(此时,我并不关心如何完成它)很简单:使用.Net将域用户帐户添加到远程服务器上的本地组中。 PowerShell不是一个选项,但即使是一个工作片段也可以。远程盒子可以是2008年,2008年x86,20058 R2,2012年,2012年R2或2016年。

    • 这不是凭证问题。涵盖在上面。
    • 这不是权限问题。也涵盖了以上内容。
    • 运行可执行文件“以管理员身份运行”并没有什么区别

    是否有人能够将域帐户添加到远程2012 R2服务器上的本地组?我还没有找到任何与实际例子相近的东西。如果是的话,对你有用吗?

    我不确定ADSI调用是否可行,因为AD需要LDAP,本地访问需要WinNT,并且它们似乎与能够执行所需的操作不重叠。

    我认为这就是我所拥有的一切......到目前为止。

    我的下一步可能是在域管理员帐户下运行的WCF服务,但这对此必须是过度的。

1 个答案:

答案 0 :(得分:0)

到目前为止,马特·约翰逊的帖子已经成功了,这很有效:

StackOverflow solution by Matt Johnson (he deserves his props!)

  1. 添加模拟类
  2. 更改上面的代码以使用新类,无论Windows服务器操作系统如何,这都有效:
  3. 我原始帖子中的代码片段现在看起来像这样(简化):

                using ( new Impersonation( "TheDomain", "TheDomainAdminAccount", "ItsValidPassword" ) )
    {
        using ( PrincipalContext adDestMachinePrincContext = new PrincipalContext( AccountManagement.ContextType.Machine,"svr2") )  {  ... etc etc etc ... }    }
    

    它正在工作。