LogonUser 函数在 c# 中失败,错误代码为 0
Posted
技术标签:
【中文标题】LogonUser 函数在 c# 中失败,错误代码为 0【英文标题】:LogonUser function fails with error code 0 in c# 【发布时间】:2012-10-10 14:36:37 【问题描述】:我的目标是用 c# 将文件夹从我的系统复制到远程计算机。 我到处搜索,找到了一些关于如何做到这一点的信息。我正在使用域、用户名和密码调用 LogonUser 函数,但它失败并返回 0。
下面是我的一段代码。你能帮我解决问题吗?
class Program
#region Assembly Functions
[DllImport("advapi32.dll")]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword,
int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr handle);
#endregion
static void Main(string[] args)
SafeTokenHandle safeTokenHandle;
WindowsImpersonationContext impersonatedUser = null;
WindowsIdentity newId;
IntPtr tokenHandle;
IntPtr userHandle = IntPtr.Zero;
tokenHandle = IntPtr.Zero;
Console.WriteLine("Enter your domain.");
string domain = Console.ReadLine();
Console.WriteLine("Enter you user name.");
string uname = Console.ReadLine();
Console.WriteLine("Enter your password (Caution, password won't be hidden).");
string password = Console.ReadLine();
const int LOGON32_PROVIDER_DEFAULT = 0;
//This parameter causes LogonUser to create a primary token.
const int LOGON32_LOGON_INTERACTIVE = 2;
bool logon = LogonUser(uname, domain, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out safeTokenHandle);
if (false == logon)
int ret = Marshal.GetLastWin32Error();
Console.WriteLine("LogonUser failed with error code : 0", ret);
throw new System.ComponentModel.Win32Exception(ret);
if (logon)
newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
using (impersonatedUser = newId.Impersonate())
// Check the identity.
Console.WriteLine("After impersonation: "
+ WindowsIdentity.GetCurrent().Name);
File.Copy(@"c:\result.xml", @"C:\result.xml", true);
//Undo impersonation
if (impersonatedUser != null)
impersonatedUser.Undo();
if (tokenHandle != IntPtr.Zero)
CloseHandle(tokenHandle);
public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
private SafeTokenHandle()
: base(true)
[DllImport("kernel32.dll")]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[SuppressUnmanagedCodeSecurity]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle(IntPtr handle);
protected override bool ReleaseHandle()
return CloseHandle(handle);
【问题讨论】:
您好,LastError 0 表示成功 - msdn.microsoft.com/en-us/library/windows/desktop/…。我认为这种情况下的问题是帐户被阻止、密码错误或类似的事情,但代码应该没问题。 您应该使用[DllImport("advapi32.dll", SetLastError = true)]
让Marshal.GetLastWin32Error
正常工作。默认情况下,SetLastError
为 false。因此,请更新您的代码并让我们知道结果。
【参考方案1】:
为什么不使用“Windows API Code Pack 1.1”,它显示(除其他外)如何使用 shell 来执行例如拖放 - 这就是您本质上尝试做的事情。
如果使用 Shell,您不必考虑如何登录以及支持各种情况所需的 1000 件其他事情。
下载“Windows API Code Pack 1.1”包并查找 DragAndDropWindow 示例或其他一些示例。
【讨论】:
以上是关于LogonUser 函数在 c# 中失败,错误代码为 0的主要内容,如果未能解决你的问题,请参考以下文章
LogonUser 和其他人在 Windows Server 2003 x86 中返回错误 1337
当用户名是 UPN 格式时,即使密码正确,Azure AD 用户的 LogonUser() 也会失败