Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Запуск от имени администратора Win 7


Автор: lollollollol 7.5.2013, 18:57
Добрый вечер. Не могу запустить на Win 7 не могу запустить программу от имени администратора.

Когда правой кнопкой нажимаете, есть Запуск от имени админа. 

Вот как запустить с админ правами программно? пока получилось лишь вызвать окно свойства, и эмуляцией нажатия клавишь, но это как-то криво.

Перешарил все коды инета, у меня вообще ругается на runas, говорит что незнает такой команды.

Автор: Poseidon 7.5.2013, 23:14
Цитата(lollollollol @  7.5.2013,  18:57 Найти цитируемый пост)
Перешарил все коды инета, у меня вообще ругается на runas, говорит что незнает такой команды.
Да ладно,первые 5 ссылок яндекса отвечают на твой вопрос. runas - это вообще самопальная функция:
Код

function runas(username, password, command: string): string;
var
  si: tstartupinfo;
  pi: tprocessinformation;
  puser, ppass, pdomain, pprogram: array [0..255] of wchar;
  lasterror: dword;
  resultstring: string;
begin
  zeromemory(@si, sizeof(si));
  si.cb:=sizeof(si);
  zeromemory(@pi, sizeof(pi));
 
  stringtowidechar(username, puser, 255);
  stringtowidechar(password, ppass, 255);
  stringtowidechar('', pdomain, 255);
  stringtowidechar(command, pprogram, 255);
  createprocesswithlogonw(
    puser,
    pdomain,
    ppass,
    1, //logon_with_profile,
    pprogram,
    nil,
    create_default_error_mode or create_new_console or
    create_new_process_group or create_separate_wow_vdm,
    nil,
    nil,
    si,
    pi
    );
  lasterror:=getlasterror;
  case lasterror of
    0: resultstring:='success!';
    86: resultstring:='wrong password';
    1326: resultstring:='wrong username or password';
    1327: resultstring:='logon failure user account restriction';
    1385: resultstring:='logon failure the user has not been granted the requested logon type at this computer.';
    2: resultstring:='file not found';
    5: resultstring:='acced denied'
  else
    resultstring:='error '+inttostr(lasterror);
  end;
  result:=resultstring;
 end;


Вот, изучай: http://engineer.d-vt.ru/programmin/10-zapusk-prilozheniya-v-windows-7-s-pravami-administratora-delphi.html

Автор: lollollollol 8.5.2013, 07:08
Оно всегда пишет что неверный логн или пароль, я пытался так уже.

Автор: lollollollol 8.5.2013, 12:30
 shExecInfo^.lpVerb := 'runas';
Почему не раотает? runas не знакомая команда, а если заменить на open то открывает. но без прав

Автор: lollollollol 8.5.2013, 15:42
    1326: resultstring:='wrong username or password';
непонимаю какое имя нужно этой функции!
Уже всё перепробывал. 

Автор: Poseidon 8.5.2013, 21:16
Ты издеваешься? Я же тебе дал направление где искать.

Скачивай http://engineer.d-vt.ru/files/unitIsAdmin.pas и добавляей его к проекту. Потом рисуй код:
Код

uses unitIsAdmin, Winapi.ShellAPI;

procedure RunAsAdministrator(const source: string);
var
  shExecInfo: PSHELLEXECUTEINFOW;
begin
  New(shExecInfo);
  with shExecInfo^ do
  begin
    cbSize := sizeof(SHELLEXECUTEINFO);
    fMask := 0;
    Wnd := 0;
    lpVerb := 'runas';
    lpFile := PChar(ExtractFileName(source));
    lpParameters := '';
    lpDirectory := PChar(ExtractFilePath(source));
    nShow := SW_SHOWNORMAL;
    hInstApp := 0;
  end;
  ShellExeCuteex(shExecInfo);
  Dispose(shExecInfo);
  shExecInfo := nil;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not IsUserAnAdmin then
    begin
      RunAsAdministrator(Application.ExeName);
      Application.Terminate;
    end;
end;

Автор: lollollollol 9.5.2013, 11:00
lpVerb := 'runas';

я же сказал что комп ругается, не знает он такой команды.
Если тут прописат open, запустит но без прав. А иначе на нессответствие ругается

Автор: Akella 9.5.2013, 13:57
runas это не команда

Автор: lollollollol 9.5.2013, 17:06
Впринципе я уже с помощью манифеста сделал, но всё таки не пойму почему с runas не работает

Автор: Poseidon 9.5.2013, 18:37
Цитата(lollollollol @  9.5.2013,  11:00 Найти цитируемый пост)
я же сказал что комп ругается, не знает он такой команды.
Скинь скрин этой "ругни"

Автор: Dik0n 9.5.2013, 19:41
100% - рабочий код, в своем приложении использую.
Код

function RunAsAdmin(hWnd: HWND; const filename, Parameters: string): Boolean;
{
    See Step 3: Redesign for UAC Compatibility (UAC)
    http://msdn.microsoft.com/en-us/library/bb756922.aspx
}
var
    sei: TShellExecuteInfo;
begin
    ZeroMemory(@sei, SizeOf(sei));
    sei.cbSize := SizeOf(TShellExecuteInfo);
    sei.Wnd := hwnd;
    sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
    sei.lpVerb := PChar('runas');
    sei.lpFile := PChar(Filename); // PAnsiChar;
    if parameters <> '' then
     sei.lpParameters := PChar(parameters); // PAnsiChar;
    sei.nShow := SW_SHOWNORMAL; //Integer;

    Result := ShellExecuteEx(@sei);
end;

Автор: Poseidon 10.5.2013, 00:10
Dik0n, чем он принципиально отличается от того, что привел я? И хотелось бы увидеть использование этой функции, а конкретно обработку ситуации, когда пользователь сам выбирает в контекстном меню "Запуск от имени администратора".

Автор: northener 10.5.2013, 01:41
Цитата(Poseidon @  10.5.2013,  00:10 Найти цитируемый пост)
Dik0n, чем он принципиально отличается

А какая разница чем он отличаеися
Пусть сначала "ололо" ответит какую ошибку выдаёт его проект без манифеста.

Автор: lollollollol 10.5.2013, 05:47
Уважаемый northener, ололо здесть если и есть, то вы. Не стоит коверкать ники.

Poseidon, небыло возможности заскринить сразу так как на компе с которого писал нет делфи.
Вот скрин.
http://www.radikal.ru
А если прописать open вместо runas, то нет этого сообщения, но и запуск без прав

Dik0n, а твой код ошибки не выдаёт, но и не запускает.

Автор: Poseidon 10.5.2013, 11:40
lollollollol, пройдись отладчиком и покажи строчку, которая вызывает это сообщение.

Автор: Dik0n 10.5.2013, 16:38
Цитата

Dik0n, а твой код ошибки не выдаёт, но и не запускает. 

Что то мне кажется что расширение у файла не .ехе, в этом и проблема.

Автор: lollollollol 10.5.2013, 22:06
Да я сам себя запустить с правами пытаюсь, ParamStr(0) , расширение точно .exe.

Отладчиком пройтись не могу, у компа с делфи только в ПН буду, тогда и сделаю

Автор: kami 10.5.2013, 22:34
Цитата(lollollollol @  10.5.2013,  22:06 Найти цитируемый пост)
Да я сам себя запустить с правами пытаюсь, ParamStr(0) , расширение точно .exe.

Скорее всего, в пути к файлу есть пробел.
Обернуть ParamStr(0) в кавычки. (").

Автор: Poseidon 10.5.2013, 22:44
lollollollol, покажи именно свой код. Потому как я искренне не понимаю людей, которым вылаживаешь кусок рабочего кода, они его коверкают и потом отписываются "не работает". Я это о твоем ParamStr(0). У меня в примере его нет. Да, я понимаю что это то же самое, что и мое Application.ExeName, но все же наличие чего-то, что не приводилось в примере, наводит на мысли о еще каких-нибудь "доработках".

Автор: lollollollol 11.5.2013, 08:43
Код

procedure RunAsAdministrator(const source: string);
var
  shExecInfo: PSHELLEXECUTEINFOW;
begin
  New(shExecInfo);
  with shExecInfo^ do
  begin
    cbSize := sizeof(SHELLEXECUTEINFO);
    fMask := 0;
    Wnd := 0;
    lpVerb := 'runas';
    lpFile := PChar(ExtractFileName(source));
    lpParameters := '';
    lpDirectory := PChar(ExtractFilePath(source));
    nShow := SW_SHOWNORMAL;
    hInstApp := 0;
  end;
  ShellExeCuteex(shExecInfo);
  Dispose(shExecInfo);
  shExecInfo := nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  if not IsUserAnAdmin then
    begin
      RunAsAdministrator(ParamStr(0));
      Application.Terminate;
    end;
end;


Р.S.
Application.ExeName = ParamStr(0) - Полный путь до запущеного файла

Добавлено через 9 минут и 52 секунды
Добрался до делфи. Для чстоты эксперемента вместо привычного ParamStr(0) использую Application.ExeName

Ошибка на строке
Код

ShellExeCuteex(shExecInfo);

Как я и ожидал. КОд не менял вообще за исключением 
Код

var
  shExecInfo: PSHELLEXECUTEINFOA; //Было PSHELLEXECUTEINFOW

Если оставить как было, компилятор ругается 
Цитата

[Error] Unit1.pas(36): Incompatible types: 'Char' and 'WideChar'
[Error] Unit1.pas(38): Incompatible types: 'Char' and 'WideChar'
[Error] Unit1.pas(42): Incompatible types: '_SHELLEXECUTEINFOW' and '_SHELLEXECUTEINFOA'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

В Uses добавил только ShellAPI

Автор: Dik0n 11.5.2013, 13:26
Попробуй манифест добавь если его нет.
Код

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Автор: lollollollol 11.5.2013, 17:05
С манифестом, как я уже выше говорил, работает.
Я не могу понять почему программно не запускается

Автор: Dik0n 11.5.2013, 22:24
Цитата

С манифестом, как я уже выше говорил, работает.
Я не могу понять почему программно не запускается

Я привел пример манифеста, без админ прав! После чего, перезапускаете себя уже с правами.

Автор: lollollollol 12.5.2013, 07:50
Извиняюсь, невнимательность, вечером попробую


P.S.
Что обозначают эти строки, почему именно эти знаечния задаются?
Цитата

version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"

Автор: lollollollol 12.5.2013, 08:46
С манифестом тоже не работает запуск

Автор: Dik0n 12.5.2013, 13:12
Цитата(lollollollol @  12.5.2013,  07:50 Найти цитируемый пост)
P.S.Что обозначают эти строки, почему именно эти знаечния задаются?Цитатаversion="6.0.0.0"        publicKeyToken="6595b64144ccf1df"

Это на Delphi 7 так было выставлено, главное здесь это
Код

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="asInvoker"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>

Цитата

С манифестом тоже не работает запуск

С моим примером кода ?

Автор: lollollollol 12.5.2013, 18:07
угу

А вот с таким манифестом
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <assemblyIdentity
   type="win32"
   name="MyCoolProgram"
   version="0.1.0.0"
   processorArchitecture="*"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
       <requestedExecutionLevel
         level="requireAdministrator"
         uiAccess="false"/>
       </requestedPrivileges>
   </security>
 </trustInfo>
</assembly>

 пытается под админом запустить. Но проблема в том что при запуске сразу запрос UAC, и если пользователь нажмёт НЕТ, приложение не запустится. 

Как можно запустить себя с правами администратора?

Автор: Akella 12.5.2013, 18:25
Цитата(lollollollol @  12.5.2013,  18:07 Найти цитируемый пост)
пытается под админом запустить. Но проблема в том что при запуске сразу запрос UAC, и если пользователь нажмёт НЕТ, приложение не запустится. 

Ну да, а как по другому?

Автор: lollollollol 12.5.2013, 18:49
Я хотел пр запуске, если нет прав администратора показать информационное сообщение, с информацией о том что программе необходимы права. И повторно выполнить запуск с правами.

Вариант с манифестом не позволяет это сделать. А запуск через runas не работает.

Автор: Dik0n 12.5.2013, 21:11
level="requireAdministrator" заменить на level="asInvoker"
Потом запускать через 'runas' но UAC все равно появится при перезапуске, для того он и разработан, иначе бы все трояны втихаря, перезапускали себя под админом.

Автор: lollollollol 12.5.2013, 21:13
Я не против UAC, мне главное чтобы runas работал. завтра попробую снова.
Хотя я уже пытался это сделать с Вашим манифестом. Там как раз  level="asInvoker", но не работает.

Автор: Poseidon 12.5.2013, 22:34
Цитата(lollollollol @  12.5.2013,  18:07 Найти цитируемый пост)
Но проблема в том что при запуске сразу запрос UAC, и если пользователь нажмёт НЕТ, приложение не запустится. 
Как можно запустить себя с правами администратора?

А как по-твоему, в чем вообще заключается функция UAC? Так, от нечего делать ее привязали? Это и есть ее работа. Если пользователь не хочет что бы твоя программа получала админ-права (нажимает "НЕТ", то UAC и не даст их твоей программе.

Автор: lollollollol 13.5.2013, 05:58
это само собой, но смысл в том, что я хочу перед этим НЕТ вывести информационное сообщение, где поясню зачем именно нужны амин права приложению.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)