यह वास्तव में संभव है। आपके पास मुख्य समस्या यह है कि विंडोज को टर्मिनल सर्वर और रिमोट सत्र के रूप में उपयोगकर्ता सत्र के रूप में देखा जाना चाहिए। आपकी सेवा दूरस्थ प्रक्रिया में चलने वाली प्रक्रिया शुरू करने में सक्षम होना चाहिए जो उपयोगकर्ता से संबंधित है।
वैसे, यदि आप एक ऐसी सेवा लिखते हैं जो Windows XP के अंतर्गत चलती है जो किसी डोमेन में नहीं जोड़ा गया है और तेज़ उपयोगकर्ता स्विचिंग सक्रिय है, तो आपको दूसरी (तीसरी) पर चलने की प्रक्रिया शुरू करने के लिए एक ही समस्या हो सकती है और इतने पर) लॉग इन उपयोगकर्ता डेस्कटॉप।
मुझे आशा है कि आपके पास उपयोगकर्ता टोकन है, जिसे आप प्रतिरूपण के संबंध में उदाहरण के लिए प्राप्त करते हैं या आपके पास dwSessionId
सत्र है। आप इसे नहीं है, तो आप इसी उपयोगकर्ताओं सत्र (LsaEnumerateLogonSessions
http://msdn.microsoft.com/en-us/library/aa378275.aspx देख सकते हैं और LsaGetLogonSessionData
http://msdn.microsoft.com/en-us/library/aa378290.aspx देखें) या ProcessIdToSessionId
पता लगाने के लिए कुछ WTS-समारोह (दूरस्थ डेस्कटॉप सेवा API http://msdn.microsoft.com/en-us/library/aa383464.aspx, उदाहरण के WTSEnumerateProcesses
या WTSGetActiveConsoleSessionId
के लिए) या एलएसए-एपीआई का उपयोग कोशिश कर सकते हैं (http://msdn.microsoft.com/en-us/library/aa382990.aspx देखें)।
आप जानता है उन hClient
टोकन उपयोगकर्ताओं सत्र के सत्र id dwSessionId
प्राप्त करने के लिए पैरामीटर TokenSessionId
(देखें http://msdn.microsoft.com/en-us/library/aa446671.aspx) के साथ GetTokenInformation
फ़ंक्शन का उपयोग कर सकते हैं।
BOOL bSuccess;
HANDLE hProcessToken = NULL, hNewProcessToken = NULL;
DWORD dwSessionId, cbReturnLength;
bSuccess = GetTokenInformation (hClient, TokenSessionId, &dwSessionId,
sizeof(DWORD), &cbReturnLength);
bSuccess = OpenProcessToken (GetCurrentProcess(), MAXIMUM_ALLOWED, &hProcessToken);
bSuccess = DuplicateTokenEx (hProcessToken, MAXIMUM_ALLOWED, NULL,
SecurityImpersonation,
TokenPrimary, &hNewProcessToken);
EnablePrivilege (SE_TCB_NAME);
bSuccess = SetTokenInformation (hNewProcessToken, TokenSessionId, &dwSessionId,
sizeof(DWORD));
bSuccess = CreateProcessAsUser (hNewProcessToken, NULL, szCommandToExecute, ...);
यह कोड केवल एक स्कीमा है। EnablePrivilege
AdjustTokenPrivileges
का उपयोग करने के लिए SE_TCB_NAME
विशेषाधिकार सक्षम करने के लिए एक साधारण फ़ंक्शन है (देखें http://msdn.microsoft.com/en-us/library/aa446619.aspx टेम्पलेट के रूप में)। यह महत्वपूर्ण है कि जिस प्रक्रिया से आप एक प्रक्रिया शुरू कर रहे हैं, आपके पास टीसीबी विशेषाधिकार है, लेकिन यदि आपकी सेवा स्थानीय सिस्टम के अंतर्गत चलती है तो आपके पास पर्याप्त अनुमतियां हैं। वैसे, कोड कोड खंड न केवल स्थानीय सिस्टम खाते के साथ काम करता है, लेकिन खाते में मौजूदा टर्मिनल सर्वर सत्र को स्विच करने में सक्षम होने के लिए SE_TCB_NAME
विशेषाधिकार होना चाहिए।
एक और टिप्पणी। उपर्युक्त कोड में हम उसी प्रक्रिया के साथ नई प्रक्रिया शुरू करते हैं क्योंकि वर्तमान प्रक्रिया में (उदाहरण के लिए स्थानीय सिस्टम) है। आप दूसरे खाते का उपयोग करने के लिए एक कोड बदलते हैं उदाहरण के लिए उपयोगकर्ता टोकन hClient
। primary token
होना केवल महत्वपूर्ण है। यदि आपके पास प्रतिरूपण टोकन है तो आप उपरोक्त कोड में जैसे प्राथमिक टोकन में इसे परिवर्तित कर सकते हैं।
CreateProcessAsUser
में इस्तेमाल STARTUPINFO
संरचना में आप lpDesktop =
WinSta0 \ डिफ़ॉल्ट "का उपयोग करना चाहिए।
अपनी आवश्यकताओं को यह भी CreateEnvironmentBlock
उपयोग करने के लिए एक नए माहौल ब्लॉक है कि आप नए के लिए गुजर रहा हो जाएगा बनाने के लिए आवश्यक हो सकता है पर निर्भर प्रक्रिया।
मैं तुम्हें सलाह देते हैं भी How to ensure process window launched by Process.Start(ProcessStartInfo) has focus of all Forms? को पढ़ने के लिए है, जहां मैं मजबूर करने के लिए कैसे है कि इस प्रक्रिया उन डेस्कटॉप पर अग्रभूमि में शुरू हो जाएगा का वर्णन।
जो उपयोगकर्ता के सत्र Win7 और Win10 पर काम करता है सायन? –
स्थानीय इंटरैक्टिव उपयोगकर्ता जो मैं केंद्रित कर रहा हूं। मैं मुख्य रूप से सेवा से वर्कस्टेशन को लॉक करने में रूचि रखता हूं, लेकिन कुछ स्थितियों के आधार पर अन्य कार्यक्रमों को निष्पादित करने की आवश्यकता भी है। – Brad