因此,我们正在尝试创建一个简单的控制台应用程序,但控制台应用程序需要使用Windows集成模式运行它与SQL服务器的连接。我说的很简单,我只是冒充一个服务帐户并以这种方式连接到SQL服务器。不幸的是,它归结为无法找到EF程序集,即使它正好在正在运行的可执行文件旁边。如果我使用相同的代码并将其放在我的using语句之外进行模拟,则代码可以正常工作。 (我有权使用SQL表,但我们的最终用户不会这样做。)
模仿似乎正在起作用,我可以获取模拟信息并将其显示在控制台上,但在处理EF 6.0时却没有。
有人有任何想法吗?
谢谢, 尼克
更新了代码:当然,这是概念证明,相关部分已经更改。
private static void VILoggingInfo()
{
AppDomain myDomain = Thread.GetDomain();
myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal myPrincipal = (WindowsPrincipal) Thread.CurrentPrincipal;
// who am I right now?
Console.WriteLine(myPrincipal.Identity.Name);
string userName = "theUserName", domainName = "theDomain";
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
SafeAccessTokenHandle safeAccessTokenHandle;
bool returnValue = LogonUser(userName,
domainName,
"thePassword",
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
out safeAccessTokenHandle);
if (returnValue == false)
{
int ret = Marshal.GetLastWin32Error();
Console.WriteLine("LogonUser failed with error code: {0}", ret);
throw new System.ComponentModel.Win32Exception(ret);
}
WindowsIdentity.RunImpersonated(safeAccessTokenHandle,
() =>
{
using (var db = new VIDataModel())
{
var newRecord = new VIExecution
{
LoginName = myPrincipal.Identity.Name,
ExecutionDate = DateTime.Now
};
db.VIExecutions.Add(newRecord);
db.SaveChanges();
}
}
);
}