当我冒充时,访问被拒绝交换shell

时间:2017-10-09 18:30:54

标签: c# powershell exchange-server remote-access impersonation

我有这个创建分发交换组的功能(这个功能很好):

private void createDistributionGroup()
{
        System.Security.SecureString pass = new System.Security.SecureString();
        foreach (char c in password)
            pass.AppendChar(c);
        PSCredential cred = new PSCredential(username, pass);

        WSManConnectionInfo connection = new WSManConnectionInfo(new Uri("http://[my_exchange].[my_domain].com/PowerShell/"), "Microsoft.Exchange", cred);
        connection.AuthenticationMechanism = AuthenticationMechanism.Default;

        Runspace runspace = RunspaceFactory.CreateRunspace(connection);
        PowerShell ps = PowerShell.Create(); 

        try
        {
            runspace.Open();
            ps.Runspace = runspace;
            ps.AddCommand("New-DistributionGroup").AddParameter("Name", "GRP_DIF_" + textBox1.Text));
            ps.Invoke();
        }
        finally
        {
            runspace.Dispose();
            runspace = null;
            ps.Dispose();
            ps = null;
        }
    }

我必须使用模拟执行我的应用程序,使用the msdn example我冒充服务帐户(MSDN示例运行良好并且模仿成功)。

在实现模拟之前,连接有效,因为我在尝试执行createDistributionGroup()函数时进行模拟,我收到错误:

  

拒绝访问:关于远程故障排除

我已立即测试使用

在本地PowerShell中打开远程PowerShell会话
$credential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://[my_exchange].[my_domain].com/PowerShell/ -Authentication Default -Credential $credential
Import-PSSession $Session

会议成功开启......

  • 我已经测试过更改服务帐户权限(即使域管理员被拒绝了......):没有效果
  • 我在Exchange服务器(本地管理员组,...)上提供特殊访问权限:无效
  • 我给了特殊的IIS权限(前端,后端,......):没有效果

为什么我冒充帐户时被拒绝以及如何授予访问权限?

1 个答案:

答案 0 :(得分:1)

模拟不适用于远程身份验证。此时,本地进程无法向远程进程证明它确实是原始客户端(这很好,因为它不是)。

当您使用Get-Credential中提供的凭据进行连接时,实际密码就在那里且可用,因此身份验证可以正常运行。

所以,这本质上是一个kerberos双跳问题,而不是人们通常遇到的问题。

如果您必须使用模拟,则需要某种方法在远程计算机上重新进行身份验证。

一种可能的方法,不一定是个好主意,是将凭据存储在加密文件中,加密文件必须由您模拟的帐户访问。我实际上并不是100%肯定这会与假冒有关,但它可能值得一试:

首先,存储您的加密凭据(以模拟用户身份运行):

$cred = Get-Credential
$cred | Export-Clixml -Path "C:\Creds\appcred_${env:USERNAME}_${env:COMPUTERNAME}.xml"

在您的应用程序代码中,冒充后:

$cred = Import-Clixml -Path "C:\Creds\appcred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://[my_exchange].[my_domain].com/PowerShell/ -Authentication Default -Credential $cred

此序列通常有效。 XML中的凭证密码使用Windows数据保护API(DPAPI)加密,密钥与用户和计算机相关,因此只能由同一用户在同一台​​计算机上解密。

正如我所说的那样,我不知道这是否会与假冒有关。

这也意味着如果您在AD中更改帐户的密码,则需要手动更新文件。