我写了一个小程序来访问SQLSERVER1
中的SQL Server数据库,并将一些数据复制到SQLSERVER2
上的另一个数据库。此程序必须在APPSERV1
(Windows Server 2012)中运行,并且我在此服务器中有登录的服务帐户:appuser1
。
appuser1
无法访问SQLSERV1
。
要访问SQLSERV1
我有另一个服务帐户svc_to_sqlserv1
;此帐户无法登录任何PC,只有SQLSERV1
"才能访问数据库。它有效。在此方案和svc_to_sqlserv
之前,我在ASP应用程序中使用了模拟,它可以正常工作(web.config
上的简单更改)。
但是现在,这个应用程序是"桌面APP"我知道在这种情况下假冒是不同的,我写了这段代码:
SafeTokenHandle safeTokenHandle;
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
// service account actual : appuser1
bool returnValue = LogonUser(svc_to_sqlserv1, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);
// error! svc_to_sqlserv1 has not permission to log on in this server, but have permission to access SQL SERVER in SQLSERV1
try
{
using (WindowsIdentity newId = new WindowsIdentity (safeTokenHandle.DangerousGetHandle()))
{
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["sctrin_conn_to_SQLSERV1"].ConnectionString))
{
....
}
}
}
}
catch...
注意:
SQLSERV1
srv_to_sqlserv1
无权在任何桌面登录,我该如何测试?我"作为另一个用户运行"某台PC上的SQL Server Management Studio。 appuser1
无权以"另一个用户身份运行"在APPSERV1
。我希望有人可以帮助我或提出任何替代方案?非常感谢你。