Подъем полномочия процесса программно?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

140
задан Cœur 23 March 2017 в 15:24
поделиться

3 ответа

Можно указать, что новый процесс должен быть запущен с поднятых полномочий путем установки свойства Verb объекта startInfo к 'runas', следующим образом:

startInfo.Verb = "runas";

Это заставит Windows вести себя, как будто процесс был запущен с Проводника с командой меню "Run as Administrator".

Это действительно означает, что подсказка контроля учётных записей подойдет и должна будет быть подтверждена пользователем: если это будет нежелательным (например, потому что это произошло бы посреди долгого процесса), то необходимо будет работать весь хост-процесс с поднятыми полномочиями Создают и Встраивают Декларацию Приложения (контроль учётных записей) для требования 'highestAvailable' уровня выполнения: это заставит подсказку контроля учётных записей появляться, как только Ваше приложение запускается, и заставьте все дочерние процессы работать с поднятыми полномочиями без дополнительного запроса.

Редактирование: Я вижу, что Вы просто отредактировали свой вопрос указать, что "runas" не работал на Вас. Это действительно странно, как это должно (и делать для меня в нескольких производственных приложениях). Требование, чтобы родительский процесс работал с поднятыми правами путем встраивания декларации, должно определенно работать, все же.

170
ответ дан 23 November 2019 в 23:15
поделиться

В соответствии со статьей Chris Corio: Учите Свои Приложения Играть Хорошо С Управлением учетными записями пользователей Windows Vista, MSDN Magazine, январь 2007 , только ShellExecute проверки встроенная декларация, и предлагает пользователю повышение в случае необходимости, в то время как CreateProcess и другие API не делают. Надежда это помогает.

См. также: та же статья как .chm.

21
ответ дан 23 November 2019 в 23:15
поделиться

Необходимо использовать Олицетворение для подъема состояния.

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

не забывают отменять явленный олицетворением контекст, когда Вы сделаны.

0
ответ дан 23 November 2019 в 23:15
поделиться