Vista контроль учётных записей, повышение доступа и .NET

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
5
задан JoelHess 17 September 2008 в 00:38
поделиться

6 ответов

То, что действительно необходимо сделать, сохранить настройки папка Application Data.

2
ответ дан 18 December 2019 в 06:13
поделиться

Невозможно поднять всего одну функцию или любую другую часть единственного процесса, потому что уровень повышения является атрибутом для каждого процесса. Точно так же, как с беременностью, Ваш процесс может или быть поднят или нет. При необходимости в некоторой части кода для выполнения поднятый, необходимо запустить отдельный процесс.

Однако, если можно реализовать функцию как 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);
}
11
ответ дан 18 December 2019 в 06:13
поделиться

Лучшая статья, которую я видел, является этим:

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

Это объясняет вниз вшивому песчаному из того, что продолжается негласно, когда существующие приложения Microsoft поднимают подсказку контроля учётных записей и немного, как сделать это самостоятельно, или по крайней мере Вы будете знать что Ваш против заставить его работать...

(отметьте примеры, которые он показывает, управляемый C++),

7
ответ дан 18 December 2019 в 06:13
поделиться

Я думаю, что Aydsman на правильном пути здесь. С добавлением поддержки Именованных каналов.NET 3.5, у Вас есть достойный механизм IPC для общения с поднятым дочерним процессом.

0
ответ дан 18 December 2019 в 06:13
поделиться

Windows SDK "Перекрестные Технологические Образцы" имеет приложение "UACDemo", которое показывает примеры приложения Windows Forms C#, которое запускает процесс администратора для выполнения задачи, которая требует повышения (т.е. пишущий в %programfiles%).

Это - большая начальная точка для записи Вашей собственной функциональности. Я расширил этот образец для использования.Net Remoting и IPC для вызова между моим процессом обычного пользователя и моим поднятым процессом, который позволяет мне сохранять исполняемый файл повышения универсальным и реализовывать специализированный код в рамках приложения.

3
ответ дан 18 December 2019 в 06:13
поделиться

Найденный хорошей статьей, которая касается этого здесь:

Большинство приложений не требует прав администратора во время выполнения. Если Ваше приложение не поддерживает перекрестное состояние сеанса, в то время как оно выполняет и не делает чего-то как изменение политики локальной защиты, оно должно очень хорошо работать с маркером стандартного пользователя. Иногда определенные части Вашего приложения будут требовать прав администратора, и необходимо выделить те части в отдельный процесс. Я войду в это немного позже.

Похож на статью, говорит об использовании C++, таким образом, я нашел другую статью, которая касается, как назвать этот код с помощью P/Invoke. Так должно быть выполнимым от.NET.

3
ответ дан 18 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: