2011-10-02 19 views
5

मैं एक इंटरैक्टिव लॉगऑन सत्र बनाने के लिए LsaLogonUser का उपयोग करने का प्रयास कर रहा हूं, लेकिन यह हमेशा STATUS_INVALID_INFO_CLASS (0xc0000003) देता है। मुझे ऑनलाइन खोज में जो मिला है, KERB_INTERACTIVE_LOGON संरचना का मेमोरी लेआउट मुश्किल है, लेकिन मुझे पूरा यकीन है कि मैंने यह सही किया है।मैं एक इंटरैक्टिव लॉगऑन के लिए LsaLogonUser को सही तरीके से कैसे कॉल करूं?

मैं भी करबरोस के बजाय MSV1.0 का उपयोग कर, प्रमाणीकरण संरचना के लिए MSV1_0_INTERACTIVE_LOGON और MSV1_0_PACKAGE_NAME पैकेज के नाम के साथ की कोशिश की है, लेकिन वह STATUS_BAD_VALIDATION_CLASS (0xc00000a7) के साथ विफल रहता है।

क्या कोई बता सकता है कि मैं यहां क्या कर रहा हूं? यहां कोड है, जिसमें अधिकांश त्रुटि हैंडलिंग छीन ली गई है। स्पष्ट रूप से यह उत्पादन-गुणवत्ता नहीं है; मैं बस एक कामकाजी नमूना पाने की कोशिश कर रहा हूँ।


// see below for definitions of these 
size_t wcsByteLen(const wchar_t* str); 
void InitUnicodeString(UNICODE_STRING& str, const wchar_t* value, BYTE* buffer, size_t& offset); 

int main(int argc, char * argv[]) 
{ 
    // connect to the LSA 
    HANDLE lsa; 
    LsaConnectUntrusted(&lsa); 

    const wchar_t* domain = L"mydomain"; 
    const wchar_t* user = L"someuser"; 
    const wchar_t* password = L"scaryplaintextpassword"; 

    // prepare the authentication info 
    ULONG authInfoSize = sizeof(KERB_INTERACTIVE_LOGON) + 
    wcsByteLen(domain) + wcsByteLen(user) + wcsByteLen(password); 
    BYTE* authInfoBuf = new BYTE[authInfoSize]; 
    KERB_INTERACTIVE_LOGON* authInfo = (KERB_INTERACTIVE_LOGON*)authInfoBuf; 
    authInfo->MessageType = KerbInteractiveLogon; 
    size_t offset = sizeof(KERB_INTERACTIVE_LOGON); 
    InitUnicodeString(authInfo->LogonDomainName, domain, authInfoBuf, offset); 
    InitUnicodeString(authInfo->UserName, user, authInfoBuf, offset); 
    InitUnicodeString(authInfo->Password, password, authInfoBuf, offset); 

    // find the Kerberos security package 
    char packageNameRaw[] = MICROSOFT_KERBEROS_NAME_A; 
    LSA_STRING packageName; 
    packageName.Buffer = packageNameRaw; 
    packageName.Length = packageName.MaximumLength = (USHORT)strlen(packageName.Buffer); 
    ULONG packageId; 
    LsaLookupAuthenticationPackage(lsa, &packageName, &packageId); 

    // create a dummy origin and token source 
    LSA_STRING origin = {}; 
    origin.Buffer = _strdup("TestAppFoo"); 
    origin.Length = (USHORT)strlen(origin.Buffer); 
    origin.MaximumLength = origin.Length; 
    TOKEN_SOURCE source = {}; 
    strcpy(source.SourceName, "foobar"); 
    AllocateLocallyUniqueId(&source.SourceIdentifier); 

    void* profileBuffer; 
    DWORD profileBufLen; 
    LUID luid; 
    HANDLE token; 
    QUOTA_LIMITS qlimits; 
    NTSTATUS subStatus; 
    NTSTATUS status = LsaLogonUser(lsa, &origin, Interactive, packageId, 
    &authInfo, authInfoSize, 0, &source, &profileBuffer, &profileBufLen, 
    &luid, &token, &qlimits, &subStatus); 
    if(status != ERROR_SUCCESS) 
    { 
     ULONG err = LsaNtStatusToWinError(status); 
     printf("LsaLogonUser failed: %x\n", status); 
     return 1; 
    } 
} 

size_t wcsByteLen(const wchar_t* str) 
{ 
    return wcslen(str) * sizeof(wchar_t); 
} 

void InitUnicodeString(UNICODE_STRING& str, const wchar_t* value, 
BYTE* buffer, size_t& offset) 
{ 
    size_t size = wcsByteLen(value); 
    str.Length = str.MaximumLength = (USHORT)size; 
    str.Buffer = (PWSTR)(buffer + offset); 
    memcpy(str.Buffer, value, size); 
    offset += size; 
} 

उत्तर

6

आप LsaLogonUser() के पैरामीटर में से एक पर गए; &authInfo के बजाय आपको केवल authInfo पास करना चाहिए। सभी को होता है :)

+1

ओच, क्या एक बेवकूफ गलती है। जब मैंने इसे ठीक किया तो यह सही ढंग से काम करता था - धन्यवाद! – Charlie

संबंधित मुद्दे

 संबंधित मुद्दे