Права администратора Delphi D7 W7

Возможные дубликаты:
Delphi: запрос UAC повышение уровня при необходимости
Права администратора Delphi D7 W7

Я использую Delphi 7 в Windows 7. Мне нужны права администратора для некоторых функций в моем приложении, которым требуется доступ в формате RAW к физическому диску. Как мне перейти на уровень администратора из исходного кода? I.E. Я проверяю права:

function IsUserAdmin : boolean;
const CAdminSia : TSidIdentifierAuthority = (value: (0, 0, 0, 0, 0, 5));
var sid : PSid;
    ctm : function (token: dword; sid: pointer; var isMember: bool) : bool; stdcall;
    b1  : bool;
begin
  result := false;
  ctm := GetProcAddress(LoadLibrary('advapi32.dll'), 'CheckTokenMembership');
  if (@ctm <> nil) and AllocateAndInitializeSid(CAdminSia, 2, $20, $220, 0, 0, 0, 0, 0, 0, sid) then
  begin
    result := ctm(0, sid, b1) and b1;
    FreeSid(sid);
  end;
end;

Если приложение запускается от имени администратора, верните True, если нет, то False. Теперь, если в результате у меня получится False, я хочу автоматически повысить уровень до администратора.

Я попробовал явное повышение прав до администратора, но если я запускаю приложение, то вижу приглашение UAC. Если я отвечу НЕТ, приложение вообще не запустится.

РЕДАКТИРОВАТЬ: Или отключите UAC только для этого приложения (ParamStr (0)) также из кода (после нажатия кнопки «Отключить UAC для этого приложения»


person wcale    schedule 08.08.2011    source источник
comment
@Conor Boyd - этой теме уже более 2-х лет. На данный момент многое изменилось. А я спрашиваю о другом.   -  person wcale    schedule 08.08.2011
comment
Ответ, на который я ссылался, все еще на 100% актуален для повышения прав в Windows 7. Его возраст не имеет значения. Ваш вопрос заключался в том, как мне повысить уровень исходного кода; Я связался с ответом на этот вопрос.   -  person Conor Boyd    schedule 08.08.2011
comment
Независимо от того, вошел ли пользователь в систему как администратор, это совершенно отдельный вопрос, связанный с выполнением процесса с повышенными правами.   -  person Conor Boyd    schedule 08.08.2011
comment
Хорошо, если это невозможно, как насчет второй части этого вопроса?   -  person wcale    schedule 08.08.2011
comment
Если я правильно понимаю, ваш второй вопрос: можно ли отключить UAC для одного приложения с помощью Delphi. Я не знаю ответа на этот вопрос (хотя я считаю, что вы не можете), и предлагаю вам задать этот вопрос как отдельный вопрос.   -  person Conor Boyd    schedule 08.08.2011
comment
Вы начали спрашивать, как улучшить ваш процесс, а это повторяющийся вопрос. Это не то же самое, что отключить UAC. Если вы хотите отключить UAC, задайте это отдельным независимым вопросом, а не второстепенным вопросом в этом повторяющемся вопросе.   -  person Rob Kennedy    schedule 08.08.2011
comment
Интересно, какова может быть ментальная модель идеи отключить UAC только для одного приложения (и, если возможно, самого приложения). Но мне это просто нужно не считается аргументом, потому что вы этого не делаете. Что-то не так с подсказкой UAC, которая вызывает какую-то немецкую тревогу, когда вы ее видите?   -  person JensG    schedule 19.04.2015


Ответы (1)


Вы не можете просто «повысить» для своего приложения в середине выполнения. Что вам нужно сделать, так это иметь другое приложение или COM-DLL, которые вы вызываете из своего приложения, и при этом вы указываете необходимые привилегии.

person Nathanial Woolls    schedule 08.08.2011
comment
Что делать, если я сбрасываю память приложения на новый адрес и выполняю с нового адреса от имени администратора? - person wcale; 08.08.2011
comment
@wcale: Ответ Натаниэля правильный, и дубликат, о котором я упоминал выше, описывает его более подробно. - person Conor Boyd; 08.08.2011
comment
@ Конор Бойд А что насчет этой части? он тоже продублирован? ›РЕДАКТИРОВАТЬ: Или отключите UAC только для этого приложения (ParamStr (0)) также из кода (после нажатия кнопки Отключить UAC для этого приложения. - person wcale; 08.08.2011
comment
Я никогда не встречал способа отключить UAC для одного приложения. Вы не хотите этого делать. Как предположил Натаниэль, лучший способ - это красиво предоставить пользователю подсказку о повышении прав в точке выполнения в вашей программе, в которой вам требуются повышенные привилегии. Для меня это хорошо сработало: иметь отдельный COM-объект, запрашивать у ОС создание этого COM-объекта в повышенном контексте, когда он мне нужен, а затем поддерживать этот COM-объект в активном состоянии до тех пор, пока мне требуются повышенные привилегии. Хорошо работает, не раздражает пользователя и является рекомендуемым подходом к UAC. - person Conor Boyd; 08.08.2011
comment
@wcale Вы не можете отключить UAC для одного приложения, и вы не можете обойти подтверждение UAC. Если бы можно было, то весь смысл UAC был бы недействителен. - person Alexey Ivanov; 08.08.2011