Vista UAC, ระดับความสูงในการเข้าถึง และ .Net

ฉันกำลังพยายามค้นหาว่ามีวิธีใดในการยกระดับฟังก์ชันเฉพาะภายในแอปพลิเคชันหรือไม่ ตัวอย่างเช่น ฉันมีแอปที่มีการตั้งค่าระบบและผู้ใช้ที่จัดเก็บไว้ในรีจิสทรี ฉันต้องการระดับความสูงเฉพาะเมื่อจำเป็นต้องเปลี่ยนการตั้งค่าระบบเท่านั้น

น่าเสียดายที่ข้อมูลทั้งหมดที่ฉันพบพูดถึงเพียงการเริ่มต้นกระบวนการใหม่ด้วยสิทธิ์ระดับสูงเท่านั้น


person JoelHess    schedule 17.09.2008    source แหล่งที่มา


คำตอบ (6)


สิ่งที่คุณต้องทำจริงๆ คือจัดเก็บการตั้งค่าของคุณไว้ในโฟลเดอร์ Application Data

person Joel Coehoorn    schedule 17.09.2008

เป็นไปไม่ได้ที่จะยกระดับเพียงฟังก์ชันเดียวหรือส่วนอื่นๆ ของกระบวนการเดียว เนื่องจากระดับระดับความสูงเป็นคุณลักษณะต่อกระบวนการ เช่นเดียวกับการตั้งครรภ์ กระบวนการของคุณสามารถยกระดับได้หรือไม่ก็ได้ หากคุณต้องการให้โค้ดบางส่วนได้รับการยกระดับ คุณต้องเริ่มกระบวนการแยกต่างหาก

อย่างไรก็ตาม หากคุณสามารถใช้ฟังก์ชันของคุณเป็นวัตถุ 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);
}
person Andrei Belogortseff    schedule 18.09.2008

บทความที่ดีที่สุดที่ฉันเคยเห็นคือบทความนี้:

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

โดยจะอธิบายรายละเอียดเล็กๆ น้อยๆ ของสิ่งที่เกิดขึ้นเบื้องหลังเมื่อแอปพลิเคชัน Microsoft ที่มีอยู่แสดงพร้อมท์ UAC และวิธีดำเนินการด้วยตนเองเล็กน้อย หรืออย่างน้อยคุณก็จะได้รู้ว่าคุณต้องเผชิญอะไรเพื่อให้มันใช้งานได้ ..

(โปรดทราบว่าตัวอย่างที่เขาแสดงได้รับการจัดการ c++)

person uzbones    schedule 17.09.2008
comment
นั่นเป็นบทความที่ยอดเยี่ยมอย่างแท้จริง ใครบ้างมีข้อมูลอ้างอิงเกี่ยวกับวิธีการนำไปใช้ในโค้ด. Net (C# หรือ VB.Net) - person cjbarth; 27.09.2011

พบบทความดีๆ ที่ครอบคลุมเรื่องนี้ที่นี่:

แอปพลิเคชันส่วนใหญ่ไม่ต้องการสิทธิ์ของผู้ดูแลระบบในขณะใช้งาน หากแอปพลิเคชันของคุณไม่รักษาสถานะข้ามเซสชันในขณะที่ดำเนินการและไม่ดำเนินการบางอย่างเช่นการแก้ไขนโยบายความปลอดภัยในเครื่อง ก็ควรจะทำงานได้ดีด้วยโทเค็นผู้ใช้มาตรฐาน บางครั้งบางส่วนของแอปพลิเคชันของคุณจะต้องมีสิทธิ์ของผู้ดูแลระบบ และคุณควรแยกส่วนเหล่านั้นออกเป็นกระบวนการที่แยกจากกัน ฉันจะพูดถึงเรื่องนี้อีกสักหน่อย

ดูเหมือนว่าบทความนี้กำลังพูดถึงการใช้ C++ ดังนั้นฉันจึงพบ บทความอื่น ที่ครอบคลุมวิธีการเรียกโค้ดนี้โดยใช้ P/Inrigg ดังนั้นควรจะทำได้จาก .NET

person Bryant    schedule 17.09.2008
comment
ลิงก์ที่อ้างอิงใช้งานไม่ได้อีกต่อไป แล้วคุณรู้จักอีกอันหนึ่งไหม? - person cjbarth; 27.09.2011

Windows SDK "Cross Technology Samples" มีแอปพลิเคชัน "UACDemo" ซึ่งแสดงตัวอย่างของแอปพลิเคชัน C# Windows Forms ซึ่งเรียกใช้กระบวนการผู้ดูแลระบบเพื่อดำเนินงานที่ต้องใช้ระดับความสูง (เช่น เขียนถึง %programfiles%)

นี่เป็นจุดเริ่มต้นที่ดีในการเขียนฟังก์ชันการทำงานของคุณเอง ฉันได้ขยายตัวอย่างนี้เพื่อใช้ .Net Remoting และ IPC เพื่อเรียกระหว่างกระบวนการผู้ใช้ปกติของฉันกับกระบวนการที่ยกระดับของฉัน ซึ่งทำให้ฉันสามารถรักษาระดับปฏิบัติการทั่วไปได้ และใช้โค้ดเฉพาะแอปพลิเคชันภายในแอปพลิเคชัน

person Adrian Clark    schedule 22.09.2008
comment
นี่คือลิงค์ไปยังตัวอย่างที่อ้างอิงข้างต้น: http://msdn.microsoft.com/en-us/library/aa970890(v=vs.90).aspx - person cjbarth; 27.09.2011

ฉันคิดว่า Aydsman มาถูกทางแล้ว ด้วยการเพิ่มการสนับสนุนเนมไปป์ใน .NET 3.5 คุณจะมีกลไก IPC ที่เหมาะสมสำหรับการสื่อสารกับกระบวนการลูกที่ยกระดับ

person Community    schedule 08.01.2009