拒绝访问交流外壳时,我模仿

问题描述:

我有这个功能,创建分发交流群(此功能效果很好):拒绝访问交流外壳时,我模仿

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()功能我得到一个错误:

Access Denied : About remote troubleshooting

我已立即进行测试使用

本地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 

和会话被成功打开...

  • 我已经测试过更改服务帐户权限(甚至域管理员他被拒绝...):没有效果
  • 我给交换服务器(本地管理员组,...)上的特殊访问权限:无效
  • 我给特价IIS权限(前端,后端,...):无效

为什么当我模拟账户被拒绝以及如何授予访问权限?

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

当您使用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中更改帐户的密码,则需要手动更新文件。

+0

Finaly我不模仿这个功能,最简单的方法就是在模拟之后调用这个函数。感谢您的解释! –