2010-03-23 6 views
1

다음 코드는 작동하지 않습니다ProtectedData.Unprotect() 이후로 가장()

IntPtr token = Win32Dll.LogonUser(“user1”, “mydomain”, “password1”); 
WindowsIdentity id = new WindowsIdentity(token); 
WindowsImpersonationContext ic = id.Impersonate(); 
byte[] unprotectedBytes = ProtectedData.Unprotect(passwordBytes, null, DataProtectionScope.CurrentUser); 
password = Encoding.Unicode.GetString(unprotectedBytes); 
ic.Undo(); 

암호가 해독되지 않습니다.

MSDN은

"If you use this method during impersonation, you may receive the following error: "Key not valid for use in specified state." This error can be prevented by loading the profile of the user you want to impersonate, before calling the method."

답변

0

는 자신이 시도하지 않은 말한다, 그러나 당신은 LoadUserProfile 관리되지 않는 API 호출을 사용을 시도 할 수 있습니다. 자세한 내용은 here을 확인하십시오.

일부 related SO questions이 있습니다.

+0

감사 AdjustTokenPrivileges를 사용하여 privs 및 활성화 할 수 있습니다. 하지만 "... id.Impersonate();"뒤에 LoadUserProfile()을 호출하려고했습니다. 코드는 여전히 작동하지 않았습니다. 또한 함수 LoadUserProfile() (반환 IntPtr 토큰)의 결과를 어떻게 처리해야할지 모르겠다. LoadUserProfile()을 그냥 호출합니까? 토큰으로 무엇인가해야합니까? – Andrey

+0

LoadUserProfile의 결과를 어떻게 처리해야할지 모르겠군요. 나는 당신의 문제를 재현하려했지만 당신이 묘사 한 예외를 결코 얻지 못한다. 로컬 및 도메인 계정으로 테스트했지만 ProtectedData.Protect는 항상 성공합니다. 행운을 빌어 요, 해결책을 찾으면 관심을 가질 수 있습니다 ... –

+0

@rwwilden : 보호 해제, 보호 해제. –

0

다음과 같은 현상이 발생합니다. DPAPI가 작동하려면 사용자의 로그온 자격 증명에서 파생 된 사용자 키 자료가 필요합니다. 이 데이터는 사용자 프로필과 함께 저장됩니다. 그래서 사용자로 실행되지 않는 프로세스가 사용자 프로필을로드해야합니다.

당신은 LoadUserProfile (에서 반환 된 데이터)

여기

은 당신이해야 할 무엇을 사용 UnloadUserProfile()를 호출해야합니다

LogonUser()를
로 가장()
LoadUserProfile()
암호화를 (.NET에서)
UnloadUserProfile()
RevertImpersonation() (실행 취소())

의 모든 단계에서 GetLastError()를 사용하여 오류를 검사해야합니다.

이 모든 것들에 대해 기본적으로 프로세스는 관리자 계정이어야합니다. 사용자 프로필을로드하려면 백업 및 복원 권한이 필요합니다. LoadUserProfile을 호출 할 때 보유하지 않은 권한 오류가 발생하면 다음을 수행해야합니다.

) 응용 프로그램 계정에 백업 및 복원 권한이 있는지 확인하십시오. b) priv는 기본적으로 활성화되어 있습니다.

당신은 당신이 응답을() http://msdn.microsoft.com/en-us/library/aa375202(VS.85).aspx