【发布时间】:2014-07-10 05:20:47
【问题描述】:
我正在尝试在 .NET 控制台应用程序中模拟用户帐户,当它到达我调用 Impersonate() 方法的位置时,应用程序似乎立即退出。方法调用在 try-catch 块中,但它甚至从未到达 'catch' 块,所以我看不出错误是什么!
以下是相关代码:
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
然后在我的应用程序开始时:
bool returnValue = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref m_tokenHandle);
if (!returnValue)
{
int ret = Marshal.GetLastWin32Error();
throw new System.ComponentModel.Win32Exception(ret);
}
// Impersonate
WindowsIdentity _identity = new WindowsIdentity(m_tokenHandle);
EmailHelper.SendErrorMessage("Windows Identity Created!", string.Format("Created at: {0}", DateTime.Now.ToLongTimeString()));
try
{
m_impersonatedUser = _identity.Impersonate();
EmailHelper.SendErrorMessage("Impersonation Complete...", string.Format("Impersonation at: {0}", DateTime.Now.ToLongTimeString()));
}
catch
{
int ret = Marshal.GetLastWin32Error();
EmailHelper.SendErrorMessage("Error impersonating user!", string.Format("Error: {0}", ret));
}
finally
{
EmailHelper.SendErrorMessage("Finally block executed?!", "What is going on?");
}
我收到了最初的“已创建 Windows 身份”电子邮件,但没有收到任何其他电子邮件!有谁知道我如何找出我的潜在错误以及为什么我的模拟不起作用?
谢谢!
编辑:
我尝试了这篇 MSDN 文章中的代码:http://msdn.microsoft.com/en-us/library/w070t6ka(v=vs.110).aspx,唯一的修改是在模拟时尝试创建文件。
修改正在更改此代码:
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
// Check the identity.
Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
}
收件人:
using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
{
// Check the identity.
Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);
System.IO.File.CreateText(@"Test.txt");
}
我在以“标准”用户身份运行 exe 时得到的输出显示 LogonUser 成功,WindowsIdentity.GetCurrent().Name 返回模拟的用户名,但创建文件失败,错误代码为 1346,根据 MSDN , 是:
ERROR_BAD_IMPERSONATION_LEVEL 1346 (0x542) 未提供所需的模拟级别,或者提供的模拟级别无效。
这是什么意思?谷歌尚未对此有所了解...
编辑 2:
我可以使用此代码模拟另一个标准用户帐户,但是当我尝试模拟我的管理员帐户时它失败了。是否可以以某种方式更改代码以允许运行此 exe 的标准用户模拟管理员帐户?
【问题讨论】:
-
请显示一些代码以揭示什么是“在使用中创建文件”。如果你写错了位置,或者使用了错误的代码,那么错误代码并不奇怪。
-
嗨 Lex Li,我编辑了我的问题以显示我添加的代码。尝试模拟管理员帐户时,应用程序不会创建文件,而是将“模拟后”行写入控制台。
-
@dasboth:您可以退出 THAT PC 并使用您在代码中指定的确切用户名/密码登录吗? (即
domain\user和password)听起来您正在尝试使用PC 上尚不存在的帐户登录。 (???) -
我运行 Visual Studio 的帐户是我的管理员帐户,这是默认登录的帐户,也是我试图模拟的帐户。然后我切换用户并以我的“标准”用户身份登录,尝试进行模拟,然后失败并出现“ERROR_BAD_IMPERSONATION_LEVEL”错误。我尝试了登录类型和模拟级别的不同组合,但都无济于事。是否可能不支持冒充管理员帐户?
标签: c# .net impersonation