当我模拟时访问被拒绝交换 shell
Access denied to exchange shell when I impersonate
我有这个创建分发交流群的功能(这个功能很好用):
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 中更改帐户密码,则需要手动更新该文件。
我有这个创建分发交流群的功能(这个功能很好用):
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 中更改帐户密码,则需要手动更新该文件。