سؤال

أحاول معرفة ما إذا كان هناك أي طريقة لرفع مستوى وظيفة معينة داخل التطبيق.على سبيل المثال، لدي تطبيق يحتوي على إعدادات النظام والمستخدم المخزنة في السجل، وأحتاج فقط إلى الرفع عندما يلزم تغيير إعدادات النظام.

لسوء الحظ، تتحدث جميع المعلومات التي صادفتها عن بدء عملية جديدة بامتيازات مرتفعة فقط.

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

المحلول

ما عليك فعله حقًا هو تخزين إعداداتك في مجلد بيانات التطبيق.

نصائح أخرى

من المستحيل رفع وظيفة واحدة فقط أو أي جزء آخر من عملية واحدة، لأن مستوى الرفع هو سمة لكل عملية.تمامًا كما هو الحال مع الحمل، يمكن أن تكون العملية لديك مرتفعة أو لا.إذا كنت بحاجة إلى تشغيل جزء ما من التعليمات البرمجية بشكل مرتفع، فيجب عليك بدء عملية منفصلة.

ومع ذلك، إذا كان بإمكانك تنفيذ وظيفتك ككائن COM، فيمكنك تشغيلها بشكل غير مباشر، عن طريق إنشاء كائن COM مرتفع، مثل هذا:

HRESULT 
CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
{
    WCHAR monikerName[1024];
    WCHAR clsid[1024];
    BIND_OPTS3 bo;

    StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);

    swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);

    memset (&bo, 0, sizeof (bo));
    bo.cbStruct = sizeof (bo);
    bo.hwnd = hwnd;
    bo.dwClassContext = CLSCTX_LOCAL_SERVER;

    // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
    MSG paintMsg;
    int MsgCounter = 5000;  // Avoid endless processing of paint messages
    while (PeekMessage (&paintMsg, hwnd, 0, 0, PM_REMOVE | PM_QS_PAINT) != 0 && --MsgCounter > 0)
    {
        DispatchMessage (&paintMsg);
    }

    return CoGetObject (monikerName, &bo, iid, ppv);
}

أفضل مقال رأيته هو هذا المقال:

http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

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

(لاحظ أن الأمثلة التي يعرضها مُدارة بلغة c++)

وجدت أ مقالة جميلة تغطي هذا هنا:

لا تتطلب معظم التطبيقات امتيازات المسؤول أثناء التشغيل.إذا لم يحافظ تطبيقك على حالة الجلسات المشتركة أثناء التنفيذ ولم يفعل شيئًا مثل تعديل سياسة الأمان المحلية، فيجب أن يكون تشغيله جيدًا باستخدام رمز مستخدم قياسي.في بعض الأحيان، تتطلب أجزاء معينة من تطبيقك امتيازات المسؤول، ويجب عليك فصل هذه الأجزاء في عملية منفصلة.سأدخل في ذلك بعد قليل.

يبدو أن المقالة تتحدث عن استخدام C++، لذلك وجدت مقال آخر يغطي كيفية استدعاء هذا الرمز باستخدام P/Invoc.لذا ينبغي أن يكون قابلاً للتنفيذ من .NET.

تحتوي Windows SDK "Cross Technology Samples" على تطبيق "UACDemo" الذي يعرض أمثلة لتطبيق C# Windows Forms الذي يطلق عملية مسؤول لتنفيذ مهمة تتطلب الترقية (على سبيل المثال.الكتابة ل %programfiles%).

هذه نقطة بداية رائعة لكتابة وظائفك الخاصة.لقد قمت بتوسيع هذه العينة لاستخدام .Net Remoting وIPC للاتصال بين عملية المستخدم العادية والعملية المرتفعة التي تسمح لي بالاحتفاظ بالارتفاع القابل للتنفيذ بشكل عام وتنفيذ التعليمات البرمجية الخاصة بالتطبيق داخل التطبيق.

أعتقد أن أيدسمان يسير على الطريق الصحيح هنا.مع إضافة دعم Named Pipes إلى .NET 3.5، لديك آلية IPC مناسبة للتواصل مع عملية فرعية مرتفعة.

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