2010-03-06 2 views
0

Windows XP Pro SP3을 사용하고 있습니다. 코드에서 SSPI 함수를 사용하고 싶습니다. 코드를 컴파일했지만 오류는 발생하지 않았습니다.SSPI 협상을 찾을 수 없음

사용할 보안 패키지를 Negotiate으로 설정하는 것이 좋습니다.

프로그램을 시작할 때 협상을 찾을 수 없으므로 사용할 수 없습니다. 그래서 "Kerberos"를 시도했지만 보안 패키지를 찾을 수 없습니다.

내가 레지스트리에서보고 있었는데, 그 키에 따라 : HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/제어 LSA// 보안 패키지, 사용할 수있는 보안 패키지는 다음과 같습니다 커버 로스MSV1_0, 보안 채널 , wdigest. 협상NTLM가 누락되었습니다.

내 프로그램이 보안 패키지를 찾을 수없는 이유를 모르겠습니다. 반환 된 오류 코드는 0x80090305이며 수정 방법에 대한 힌트를 찾을 수 없습니다.

SSPI를 마스터하면 도움이 필요합니다. 레지스트리에서 수정할 항목이 있습니까? 아니면 일부 DLL을 등록해야합니까?

모든 힌트를 주셔서 감사합니다 안녕히 가세요!

+0

SSPI를 살펴본 후 오랜 시간이 지났지 만 문서를 신뢰할 수는 없습니다. 틀렸어. 나는 이것을 할 수있는 두 가지 방법이 있다는 것을 기억하는 것 같습니다. * 동등한 것이지만 의미가 없습니다 (보안 패키지의 전체 목록 만 반환합니다). 코드를 파헤쳐 볼 수 있는지는 알지만 약속은 없습니다. – Draemon

+0

예, 설명서가 잘못되었습니다 ... 많은 오류를 수정해야했습니다! ... 그리고 마지막으로 컴파일하지만 보안 패키지를 찾을 수 없습니다./ –

답변

2

SSPI 코드 :

그것이 작동하는 경우가 않는 경우, 그것을 재 - 시도하고 NTLM이 협상으로 대체 참조,이 코드를 시도하지 않고 디버깅하는 소입니다. 실제로, "Negotiate"라는 단어를 사용하는 대신 #include "security.h"를 사용하고 NEGOSSP_NAME을 사용하십시오. (INT의 ARGC _TCHAR *는 argv [])

INT 메인 { ULONG의 cPackages = 0; 또한

이 시도하고 협상 목록에 있는지 PSecPkgInfo pInfo = NULL; SECURITY_STATUS stat = EnumerateSecurityPackages (& cPackages, & pInfo);if (stat == SEC_E_OK) { for (ULONG i = 0; i < cPackages; i ++) { wprintf (L "% s \ t % s \ n", pInfo [i] .Name, pInfo [i] .논평); } FreeContextBuffer (pInfo); } return 0; }

헤더에 SECURITY_WIN32를 정의하고 secur32로 링크해야합니다.

+0

다른 생각 - SSPI가 유니 코드로 작동한다는 것을 알고 있습니까? 항상 유니 코드!ASCII가 아님 :) ASCII 문자열을 SSPI 함수에 전달하면 유니 코드 끈처럼 보입니다. 따라서 문자열 상수를 사용한다면 문자열 앞에 'L'을 붙이십시오. 사용하지 마십시오 : char * szName = "Negotiate"; 사용 : wchar_t * wszName = L "협상"; 참고 : –

+0

도움 주셔서 대단히 감사합니다! 결과는 다음과 같습니다. 협상은 Keberos, NTLM, Schannel, WDigest뿐 아니라 ... 이제 유니 코드에 코드를 적용하고 작동하는지 확인해야합니다. –

+0

고맙습니다. 많은 Michael, 이제 내 서버가 매력처럼 작동합니다! :) –