0
제 목표는 시스템의 폴더를 C#의 원격 컴퓨터로 복사하는 것입니다. 나는 어디에서나 수색을하고 어떻게하는지에 대한 정보를 발견했다. 도메인, 사용자 이름 및 암호를 사용하여 LogonUser 함수를 호출하지만 실패하고 0을 반환합니다.LogonUser 함수가 C#에서 오류 코드 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은 성공을 의미합니다 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx. 나는이 경우에 문제가 계정, 잘못된 암호 또는 이와 유사한 것으로 막혀 있다고 생각하지만 코드는 괜찮을 것입니다. – Ondra
'Marshal.GetLastWin32Error'가 제대로 작동하려면'[DllImport ("advapi32.dll", SetLastError = true)]'를 사용해야합니다. 기본적으로,'SetLastError'는 false입니다. 따라서 코드를 업데이트하고 결과를 알려주십시오. –