CreateProcessWithlogonw () مشاكل - تحتاج إلى إطلاق العمليات الفرعية مع نفس المستخدم

StackOverflow https://stackoverflow.com/questions/595176

سؤال

لدي نظام Windows قابل للتنفيذ يتم تشغيله من داخل الخدمة عن طريق الاتصال CreateProcessWithlogonw () مع مجموعة من تفاصيل المستخدم المواصفات.

هذا يعمل بشكل جيد وتبدأ العملية كما هو متوقع. ومع ذلك، عندما تحاول هذه العملية تشغيل عمليات أخرى نفسها، فقط فقط باستخدام CreateProcess () هذه البدء، ثم تموت على الفور - فهي ملفات تنفيذية تتطلب الوصول إلى سطح المكتب.

بعد القراءة حول مقالة Microsoft عن CreateProcess () - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx.

أعتقد أنه يمكن أن نرى لماذا يحدث هذا ومن المنطقي إلى حد ما. يعلم CreateProcess () أن عملية الاتصال تنطبق على مستخدم حتى يستخدم العملية الأصلية، والتي في هذه الحالة هي حساب النظام المحلي. ولكن بالطبع لا يحتوي أي شيء يعمل في حساب النظام المحلي على الوصول الذي نحتاج إليه، لذلك تموت العملية المطلقة.

من الغريب عندما كنت في السابق استخدام LogonUser () و CreateProcessAser () لإطلاق القابل للتنفيذ الأولي في الخدمة، فقد عملت بشكل جيد. ولكن اضطررت لتغيير هذا إلى creadprocesswithlogonw () بسبب المشاكل مع عدم وجود الامتيازات الصحيحة.

هل يعرف أي شخص حل لهذا؟ لقد رأيت تحدث عن هذا في أي مكان آخر على الويب ولكن ليس بأي محلول محدد. يبدو أنه من المحتمل أن أحتاج إلى رمز المستخدم الذي أقوم بتسجيل الدخول باستخدام CreateProcessWithlogonw () حتى أتمكن من استخدامه لإطلاق العمليات الأخرى لاحقا؟ ولكن ليس لدي أي طريقة للحصول على هذا الرمز المميز، هل يمكن إعادة تقييد هذا للمستخدم الحالي بأي شكل من الأشكال؟

أي مساعدة سيكون موضع تقدير كبير، وذلك بفضل :)

هل كانت مفيدة؟

المحلول

هل تمتلك التعليمات البرمجية التي تم إطلاقها باستخدام CreateProcessWithLogonW (والتي بدورها المكالمات CreateProcess) إذا لم تفعل بعد ذلك، فقد تحتاج إلى أداء IAT (أو API) هوينغ على ذلك (أي في وقت التشغيل)، لاستبدال أي مكالمات إلى CreateProcess مع إجراء مناسب يستخدم أيضا CreateProcessWithLogonW أو CreateProcessWithTokenW. وبعد يرى aphijack., التحف.

بعد القيام بذلك، قد تتطلب عملية الطفل الوصول إلى HKCU. وبعد إذا لم تكن قد أفعل ذلك بالفعل، فيجب عليك تحميل ملف تعريف كل مستخدم من ينطبحك، مرة واحدة لكل مستخدم، قبل الاتصال CreateProcessWithLogonW.

بشكل افتراضي، لا يقوم CreateProcessWithlogonw بتحميل ملف تعريف المستخدم المحدد في مفتاح التسجيل HKEY_USERS. هذا يعني أن الوصول إلى المعلومات في مفتاح التسجيل HKEY_CURRENT_USER قد لا ينتج نتائج متوافقة مع تسجيل دخول تفاعلي طبيعي. تقع على عاتقك مسؤولية تحميل تسجيل سجل المستخدم في HKEY_USERS قبل استدعاء CreateProcessWithlogonw، باستخدام Logon_With_Profile، أو عن طريق استدعاء وظيفة LoadUserProfile.

نصائح أخرى

نحل المشكلة باستخدام بعض الكود الذي وجدته منذ فترة طويلة. يحتوي قسم "حقوق الطبع والنشر" من أحد الوحدات النمطية المصدر على ما يلي:

/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
// 
// Written by Valery Pryamikov (1999)
// 
// Command line utility that executes a command under specified user identity 
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility 
//   and from tlist sample (Microsoft Source Code Samples)
//
// Use:
//  CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
//       [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
//  Command must begin with the process (path to the exe file) to launch
//  -i        process will be launched under credentials of the 
//            "Interactive User" (retrieved from winlogon\shell process)
//  -a        process will be launched under credentials of the user 
//            specified in "RunAs" parameter of AppID.
//  -s        process will be launched as local system
//  -u -d -p  process will be launched on the result token of the 
//            LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
// 
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////

ربما ستحقق هذه المعلومات من الزيارات داخل عمليات البحث في Google الخاصة بك - حاولت بعض المحاولات السريعة ولكن جاءت خالي الوفاض. نحن نتحلل داخليا في مجموعة من API التي أسفرت عن النتائج التي نحتاجها.

ليس هناك خيار للخدمات للسماح لهم بالتفاعل مع سطح المكتب؟ إذا كان إعداد هذا الخيار لخدمتك هو احتمال، فمن المحتمل أن يكون ذلك أبسط الحل.

أفترض أن هذه العملية هي خدمة؛ لم يتم تحديد ذلك في السؤال، ولكن يبدو منطقي معطى أنه يعمل كحساب للنظام المحلي.

حيث كنت تتعثر ليست في CreateProcess, ، انها في CreateService. وبعد إذا كنت تريد أن تكون خدمتك قادرا على التفاعل مع سطح المكتب، فعليك تحديدها SERVICE_INTERACTIVE_PROCESS كواحد من الأعلام إلى الحجة dwServiceType. وبعد هذا الإعداد موروث بعمليات الأطفال في الخدمة.

يمكنك أيضا تعديل إعداد خدمة موجود باستخدام أداة "الخدمات"، حدد خصائص للخدمة، انقر فوق علامة التبويب "تسجيل الدخول"، وحدد خانة الاختيار "السماح للخدمة بالتفاعل مع سطح المكتب".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top