2009-08-17 10 views
5

मैं कुछ कोड है जिसके साथ मैं वर्तमान सत्र उपयोगकर्ता टोकन प्राप्त करने की कोशिश कर रहा हूँ:मैं भौतिक सत्र के लिए वर्तमान उपयोगकर्ता टोकन कैसे प्राप्त कर सकता हूं?

#include <Wtsapi32.h> 

DWORD activeSessionId = WTSGetActiveConsoleSessionId(); 

HANDLE currentToken; 
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken); 

if (!queryRet) { 
    DWORD err = GetLastError(); 
    return 0; 
} 

अं का मूल्य है 1314

अद्यतन 1

कोई किस्मत अब तक की कोशिश की वर्तमान प्रक्रिया SE_TCB_NAME प्रदान करने के लिए - लेकिन अभी भी WTSQueryUserToken (1314) से एक ही त्रुटि मिलती है।

HANDLE process = GetCurrentProcess(); 

HANDLE processToken; 
BOOL openTokenRet = OpenProcessToken(
    process, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken); 

if (!openTokenRet) 
{ 
    DWORD err = GetLastError(); 
    return 0; 
} 

TOKEN_PRIVILEGES tokenPrivs; 
BOOL lookupRet = LookupPrivilegeValue(
    NULL, SE_TCB_NAME, &tokenPrivs.Privileges[0].Luid); 

if (!lookupRet) 
{ 
    DWORD err = GetLastError(); 
    return 0; 
} 

tokenPrivs.PrivilegeCount = 1; 
tokenPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

BOOL adjustRet = AdjustTokenPrivileges(
    processToken, FALSE, &tokenPrivs, 0, (PTOKEN_PRIVILEGES)NULL, 0); 

if (!adjustRet) 
{ 
    DWORD err = GetLastError(); 
    return 0; 
} 

// get the user in the active session 
HANDLE currentToken; 
BOOL queryRet = WTSQueryUserToken(activeSessionId, &currentToken); 

if (!queryRet) { 
    DWORD err = GetLastError(); 
    return 0; 
} 
अद्यतन 2

:

जोड़ा गया कुछ और डिबग जानकारी है, लेकिन prevState.PrivilegeCount 0 है ...

TOKEN_PRIVILEGES prevState; 
DWORD prevStateLen = 0; 

BOOL adjustRet = AdjustTokenPrivileges(
    processToken, FALSE, &tokenPrivs, 
    sizeof(TOKEN_PRIVILEGES), &prevState, &prevStateLen); 

DWORD adjustErr = GetLastError(); 
if (!adjustRet) 
{ 
    return 0; 
} 

समाधान:

ऐसा लगता है कि WTSQueryUserToken केवल जब इस्तेमाल किया जा सकता लोकलसिस्टम के रूप में चल रहा है, जिसका मतलब है कि मुझे एक सेवा के रूप में चलाने और वहां से डीबग करना होगा ... दोह!

उत्तर

8

त्रुटि 1314 ERROR_PRIVILEGE_NOT_HELD है। WTSQueryUserToken को कॉल करने के लिए आपको SE_TCB_NAME विशेषाधिकार की आवश्यकता है।

यह विशेषाधिकार आमतौर पर केवल स्थानीय सिस्टम के रूप में चलने वाले कोड द्वारा आयोजित किया जाता है। यदि यह विशेषाधिकार आपके टोकन में मौजूद है, लेकिन अक्षम है, तो आप इसे सक्षम करने के लिए AdjustTokenPrivileges का उपयोग कर सकते हैं। चूंकि SE_TCB_NAME एक संभावित खतरनाक विशेषाधिकार है, इसलिए इसका उपयोग करने के तुरंत बाद आपको इसे फिर से अक्षम करना चाहिए। यह देखने का एक आसान तरीका है कि क्या आपके पास यह विशेषाधिकार है प्रक्रिया प्रक्रिया विंडो की सुरक्षा तालिका में प्रक्रिया एक्सप्लोरर के साथ।

प्रति अद्यतन 1 - एडजस्ट टोकन रिवाइलीज सफलता वापस कर रहा है, लेकिन GetLastError() ERROR_NOT_ALL_ASSIGNED पर सेट है? एमएसडीएन इंगित करता है कि विशेषाधिकार सक्षम नहीं होने पर यह इसे वापस कर सकता है। क्या आप सत्यापित कर सकते हैं कि आपकी प्रक्रिया में SE_TCB_NAME विशेषाधिकार है, लेकिन यह अक्षम है? आपकी प्रक्रिया किस खाते के रूप में चल रही है?

+0

हम्म, कोशिश की लेकिन बिना किसी किस्मत के। कृपया अद्यतन जांचें 1. –

+0

एमएसडीएन से: टोकन में न्यूस्टेट पैरामीटर में निर्दिष्ट विशेषाधिकारों में से एक या अधिक नहीं है। फ़ंक्शन इस त्रुटि मान के साथ सफल हो सकता है भले ही कोई विशेषाधिकार समायोजित न हो। पिछला चरण पैरामीटर समायोजित किए गए विशेषाधिकारों को इंगित करता है। ऐसा लगता है कि यह कार्य सफल हो सकता है लेकिन विशेषाधिकार सक्षम नहीं करता है। – Michael

+0

आह, मैं पुष्टि कर सकता हूं GetLastError() ERROR_NOT_ALL_ASSIGNED देता है - लेकिन एडजस्टरेट का मान सत्य है। इसलिए, मैंने एक टोकन_PRIVILEGES संरचना पॉप्युलेट की है, लेकिन PrivilegeCount का मान 0 है ... क्या इसका मतलब यह नहीं बदला गया है? अद्यतन देखें 2. –

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

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