2012-10-10 5 views
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); 
    } 
} 
+1

안녕하세요, LastError 0은 성공을 의미합니다 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx. 나는이 경우에 문제가 계정, 잘못된 암호 또는 이와 유사한 것으로 막혀 있다고 생각하지만 코드는 괜찮을 것입니다. – Ondra

+3

'Marshal.GetLastWin32Error'가 제대로 작동하려면'[DllImport ("advapi32.dll", SetLastError = true)]'를 사용해야합니다. 기본적으로,'SetLastError'는 false입니다. 따라서 코드를 업데이트하고 결과를 알려주십시오. –

답변

-2

"Windows API Code Pack 1.1"을 사용하여 (특히) 쉘을 사용하는 방법을 보여줍니다. 드래그 앤 드롭 - 당신이 근본적으로 시도하는 것입니다.

셸을 사용하는 경우 로그온하는 방법과 다양한 상황을 지원하는 데 필요한 1000 가지 기타 사항을 고려할 필요가 없습니다.

"Windows API Code Pack 1.1"패키지를 다운로드하고 DragAndDropWindow 샘플 또는 다른 샘플을 찾습니다.