Pergunta

Estou tentando descobrir se existe alguma maneira de elevar uma função específica dentro de um aplicativo.Por exemplo, tenho um app com configurações de sistema e de usuário que ficam armazenadas no registro, só preciso de elevação para quando as configurações do sistema precisarem ser alteradas.

Infelizmente, todas as informações que encontrei falam apenas sobre iniciar um novo processo com privilégios elevados.

Foi útil?

Solução

O que você realmente precisa fazer é armazenar suas configurações na pasta Application Data.

Outras dicas

É impossível elevar apenas uma função ou qualquer outra parte de um único processo, porque o nível de elevação é um atributo por processo.Assim como na gravidez, seu processo pode ser elevado ou não.Se precisar que alguma parte do seu código seja executada de forma elevada, você deverá iniciar um processo separado.

No entanto, se você puder implementar sua função como um objeto COM, poderá executá-la indiretamente, criando um objeto COM elevado, como este:

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);
}

O melhor artigo que vi é este:

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

Ele explica detalhadamente o que está acontecendo nos bastidores quando os aplicativos existentes da Microsoft trazem o prompt do UAC e um pouco de como fazer isso sozinho, ou pelo menos você saberá o que está enfrentando para fazê-lo funcionar. ..

(observe que os exemplos que ele mostra são gerenciados em C++)

Encontrei um bom artigo que cobre isso aqui:

A maioria dos aplicativos não requer privilégios de administrador em tempo de execução.Se o seu aplicativo não mantiver o estado de sessão cruzada enquanto é executado e não fizer algo como modificar a política de segurança local, ele deverá funcionar perfeitamente com um token de usuário padrão.Às vezes, certas partes do seu aplicativo exigirão privilégios de administrador e você deve separar essas partes em um processo separado.Falarei sobre isso um pouco mais tarde.

Parece que o artigo fala sobre o uso de C++, então descobri outro artigo que aborda como chamar esse código usando P/Invoke.Portanto, deve ser possível no .NET.

O Windows SDK "Cross Technology Samples" possui um aplicativo "UACDemo" que mostra exemplos de um aplicativo C# Windows Forms que inicia um processo de administrador para executar uma tarefa que requer elevação (ou seja,escrevendo para %programfiles%).

Este é um excelente ponto de partida para escrever sua própria funcionalidade.Estendi este exemplo para usar .Net Remoting e IPC para chamar entre meu processo de usuário normal e meu processo elevado, o que me permite manter o executável de elevação genérico e implementar código específico do aplicativo dentro do aplicativo.

Acho que Aydsman está no caminho certo aqui.Com a adição do suporte a Named Pipes ao .NET 3.5, você tem um mecanismo IPC decente para se comunicar com um processo filho elevado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top