2010-05-26 1 views
2

두 컴퓨터 간에는 서로 다른 도메인에 있으므로 신뢰가 없습니다.LOGON32_LOGON_NEW_CREDENTIALS를 사용하는 LogonUser는 신뢰할 수없는 원격 도메인 컴퓨터에 대해 작동합니다.

로그온 유형을 사용하여 LogonUser API를 사용하여 원격 컴퓨터에 성공적으로 연결했습니다. LOGON32_LOGON_NEW_CREDENTIALS. UNC 공유를 사용하여 디렉터리의 내용을 검색하고 파일을 다운로드하여 파일을 다운로드 할 수 있습니다. 여태까지는 그런대로 잘됐다.

유일한 문제는 이미 열린 세션이 아니면 LogonUser가 실패하는 것입니다. 그 점을 분명히하자.

ASP.NET MVC 페이지가 오늘 아침에 작동하지 않는 것을 발견했습니다. 특히 LogonUser를 사용하여이 원격 시스템에서 파일 목록을 검색하는 페이지가 있습니다. 로그를보고 stacktrace에서 볼 수 있습니다. System.IO .__ Error.WinIOErrorDirectory.GetFiles 호출합니다. 그런 다음 웹 서버에 원격으로 연결하고 웹 사이트에서 사용하는 것과 동일한 로그인/암호를 사용하여 탐색기에서 원격 폴더를 열려고했습니다. 그것은 통과했고 파일을 볼 수있었습니다. 명령 프롬프트를 열고 net use을 입력하면 원격 컴퓨터에 열린 연결이 있음을 알 수 있습니다. 그런 다음 페이지로 돌아가 갑자기 페이지가 다시 작동합니다.

따라서 LogonUser가 예상대로 작동하는지 확실하지 않습니다. 전화가 다른 방법으로 네트워크 연결을 먼저 열어야하는 경우 확실히 만족스럽지 않습니다.

누군가 무슨 일이 일어나고 있는지 알고 있거나 해결 방법을 제안하고 있습니까?

+0

LogonUser 호출 후에도 ImpersonateLoggedOnUser를 사용하고 있습니까? –

+0

... 가능한 설명은 [1] [여기]를 참조 [1] : http://stackoverflow.com/a/7614904/95966 –

답변

1

LogonUser을 사용하는 이유를 잘 모르겠습니다. 이 기능은 다른 사용자 자격 증명으로 로컬 컴퓨터에서 작업을 수행하려고하지만 다른 컴퓨터에 원격 연결을 설정하는 데 도움이됩니다.

원격 컴퓨터에서 기존 신뢰와 독립적으로 정보를 얻으려면 WNet 또는 Net (네트워크 관리) 기능을 사용하여 원격 컴퓨터에 새 연결을 설정해야합니다. 따라서 WNetAddConnection2 (http://msdn.microsoft.com/en-us/library/aa385413%28VS.85%29.aspx 참조) 또는 NetUseAdd (http://msdn.microsoft.com/en-us/library/aa370645%28VS.85%29.aspx) 기능을 사용해야합니다. 이 기능은 대상 컴퓨터에서 원격 로그인을 만들고 새 세션을 만듭니다 (정확히 net use \\computer\share /u:domain\user password). 새 연결을 로컬 드라이브에 매핑 할 수 없습니다. 이렇게하려면 lpLocalNameNULL으로 채우고 NETRESOURCE 구조체에 입력해야합니다. lpUsernamelpPassword으로 대상 컴퓨터를 이해하는 값을 제공해야합니다. 대상 공유 이름으로 ipc$을 사용할 수도 있습니다. 그런 다음 컴퓨터에 세션 만 설정하면됩니다. 그런 다음 다른 기능을 사용하여 원격 공유, 디렉토리 또는 파일에 액세스 할 수 있습니다. 세션을 닫으려면 WNetCancelConnection2 또는 NetUseDel을 사용해야합니다.

+0

감사합니다. 사실 나는 WNetAddConnection2를보고 있었고 작동하는 구현을했습니다. 유일한 관심사는 ASP.NET 응용 프로그램 (읽기 : 장기 실행)이므로이 네트워크 연결 (일명 순수 사용)을 만들면 악영향을 미칩니 까? 하나 생각해? –

+0

아, 또한 LogonUser가 원래 조건에서 언급 한 특정 조건에서 작동하는 이유는 무엇입니까? –

+0

ASP.NET MVC 애플리케이션이 다른 누군가를 설립 한 세션을 사용했다고 가정합니다. – Oleg

0

LogonUser를 원격 컴퓨터에 연결하는 방법입니다. LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50을 사용하고 있는지 확인하십시오. 그런 다음 토큰을 가장합니다. WNetAddConnection2 없이는 이런 방식으로 많은 원격 작업을 수행 할 수 있어야합니다. WNetAddConnection2는 연결이 많은 것들로 파괴 될 수 있기 때문에 그리 좋지 않습니다. LogonUser는 여러 API 호출이 필요할 때 적절한 연결을 설정합니다.

PXERR impersonate_user(LPCWSTR lpszUserName, LPCWSTR lpszDomain, LPCWSTR lpszPassword) 
{ 
    HANDLE token; 

    if(!LogonUserW(lpszUserName, lpszDomain, lpszPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &token)) 
    { 
     return PXERR_IMPERSONATION_FAILURE; 
    } 

    if(!ImpersonateLoggedOnUser(token)) 
    { 
     CloseHandle(token); 
     RevertToSelf(); 
     return PXERR_IMPERSONATION_FAILURE; 
    } 

    CloseHandle(token); 

    return PXERR_SUCCESS; 
}