我们在 Powershell 远程脚本任务上使用 Credssp 取得了很大的成功。它很好地解决了第二跳问题并且易于设置。
在此示例中,我们在远程服务器上启动部署脚本。系统会提示管理员输入密码,整个部署过程以他的身份运行。对生产系统上的 SQL 服务器和文件共享的访问都被授予。
# Connect to the remote server where the command will run. This will prompt the user for their password...
$Session = New-PSSession -ComputerName $Server -Authentication Credssp -Credential "$env:USERDOMAIN\$env:USERNAME"
# Build up the complete command string that will be run on the server before turning it into a script block...
$Command = "& `"C:\Program Files (x86)\VisBuildPro8\VisBuildCmd.exe`" DEPLOY_CONTEXT=$DeployTarget /b `"Deploy.bld`""
# Convert the command string into script block so it will be compatible with Invoke-Command...
$ScriptBlock = [System.Management.Automation.ScriptBlock]::Create($Command)
# Launch the command on the remote server...
Invoke-Command -Session $Session -ScriptBlock $ScriptBlock
我们希望将此代码移动到 Web 应用程序,以便管理员获得一个网页来启动部署,而不是一个 Powershell 控制台。像之前的许多其他问题一样,我们被困在第二跳问题上。我们可以在网页上向管理员询问他的密码并创建一个 WindowsIdentity。我们使用 MSDN https://msdn.microsoft.com/en-us/library/w070t6ka(v=vs.110).aspx中的这篇文章设置了模拟,但它无法访问 SQL 服务器和其他资源。
到目前为止,这里有一些代码:
// The WindowsIdentity programming used here was taken from https://msdn.microsoft.com/en-us/library/w070t6ka(v=vs.110).aspx
const int LOGON32_PROVIDER_DEFAULT = 0;
// This parameter causes LogonUser to create a primary token.
const int LOGON32_LOGON_INTERACTIVE = 2;
SafeTokenHandle safeTokenHandle;
// Call LogonUser to obtain a handle to an access token.
var returnValue = LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);
if (!returnValue)
{
throw new DrilQuipException(string.Format("User Login {0}\\{1} failed.", domainName, userName));
}
using (var newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
{
using (var impersonatedUser = newId.Impersonate())
{
// This line is the VisBuildPro object model being used to launch the program...
this.builder.SyncBuildEx();
}
}
我真的不完全理解这个 Windows 安全代码。我只是戳了一下它,希望它最终能奏效。
那里是否有一个选项可以让我在.Net 编程中使用相同的 Credssp 协议,或者这是一个死胡同?
谢谢