Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.01.2013, 04:36
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию Запуск программы от имени администратора

Здравствуйте! Недавно задался такой задачей. Видел в интернете много примеров реализации, но толком ничего не работает.. Так вот что я хочу: сделать программу на delphi чтобы при нажатии на кнопку открывалось диалоговое окно с выбором exeшника и оно запускало эту программу используя имя и пароль админа (они известны). Я хочу один раз их вбить в программу и пользоваться.. Как такое реализовать, помогите!
Ответить с цитированием
  #2  
Старый 05.01.2013, 11:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Мне кажется, что надо копать в сторону CreateProcessEx и соотв. SecurityDescriptor'a...
Ответить с цитированием
  #3  
Старый 05.01.2013, 13:40
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Я вот пытался что-то сделать, но чего-то не работает.. может посоветуете что-нибудь?
Вложения
Тип файла: rar RunAsAdmin.rar (168.5 Кбайт, 68 просмотров)
Ответить с цитированием
  #4  
Старый 05.01.2013, 19:21
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Ну что, знает кто-нибудь как решить эту задачу? Теоретически это не трудно..но я не могу понять почему, к примеру, моя программа не работает..
Ответить с цитированием
  #5  
Старый 06.01.2013, 10:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
procedure RunAsAdministrator(const source:string);
var
  shExecInfo: PShellExecuteInfoA;
begin
  New(shExecInfo);
  shExecInfo^.cbSize := SizeOf(SHELLEXECUTEINFOA);
  shExecInfo^.fMask := 0;
  shExecInfo^.Wnd := 0;
  shExecInfo^.lpVerb := 'runas';
  shExecInfo^.lpFile := PAnsiChar(ExtractFileName(source));
  shExecInfo^.lpParameters := '';
  shExecInfo^.lpDirectory := PAnsiChar(ExtractFilePath(source));
  shExecInfo^.nShow := SW_SHOWNORMAL;
  shExecInfo^.hInstApp := 0;
  ShellExecuteEx(shExecInfo);
  Dispose(shExecInfo);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Dmitry_DM (06.01.2013)
  #6  
Старый 06.01.2013, 12:22
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

А как к этой процедуре обращаться, и что надо писать в uses что бы программа понимала типы переменных, которые используются в этой процедуре?
Ответить с цитированием
  #7  
Старый 06.01.2013, 12:32
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
uses
  ShellAPI, Windows,
...
begin
  RunAsAdministrator('c:\Windows\notepad.exe');
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Dmitry_DM (06.01.2013)
  #8  
Старый 06.01.2013, 13:02
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Спасибо! с этим понятно.. а куда вбивать логин и пароль админа?
Ответить с цитированием
  #9  
Старый 06.01.2013, 17:48
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Оно работает, у меня на компьютере, где я и так админ. А там, где я буду юзером с ограниченными правами, оно запустит программу от имени администратора?
Ответить с цитированием
  #10  
Старый 06.01.2013, 18:06
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Я уже проверил.. Оно в диспетчере задач как было от гостя запуск, так и осталось.. А вот так как TC делает, можно так? Только не вводя имя и пароль админа, а в delphi проекте вбить эти данные.
Ответить с цитированием
  #11  
Старый 06.01.2013, 19:31
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Dmitry_DM
чтото самому проверять влом (создавать учётку юзерскую)
попробуй в строку
shExecInfo^.lpParameters := '';
которую показал NumLock
вместо пробела впиши параметры(логин и пароль) в формате, в которм они в командную строку вписываются по команде runas
для инофрмации юзай cmd runas/?
Ответить с цитированием
  #12  
Старый 06.01.2013, 19:48
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

хм походу так не получиться, по правилам безопасности команда runas не принимает пароль.только логин,а пароль запрашивается уже после ввода команды
Ответить с цитированием
  #13  
Старый 06.01.2013, 19:58
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от Snake22
Dmitry_DM
чтото самому проверять влом (создавать учётку юзерскую)
попробуй в строку
shExecInfo^.lpParameters := '';
которую показал NumLock
вместо пробела впиши параметры(логин и пароль) в формате, в которм они в командную строку вписываются по команде runas
для инофрмации юзай cmd runas/?
Пробовал так:
Код:
  shExecInfo^.lpParameters := 'user:Lenovo';
Оно все-равно запускает от имени "Гость"
Ответить с цитированием
  #14  
Старый 07.01.2013, 10:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
function CreateProcessWithLogonW(
    lpUsername: LPCWSTR;
    lpDomain: LPCWSTR;
    lpPassword: LPCWSTR;
    dwLogonFlags: DWORD;
    lpApplicationName: LPCWSTR;
    lpCommandLine: LPWSTR;
    dwCreationFlags: DWORD;
    lpEnvironment: Pointer;
    lpCurrentDirectory: LPCWSTR;
    const lpStartupInfo: _STARTUPINFOA;
    var lpProcessInfo: _PROCESS_INFORMATION
  ): Boolean; stdcall; external 'Advapi32.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  startupinfo: _STARTUPINFOA;
  processinformation: _PROCESS_INFORMATION;
begin
  ZeroMemory(@startupinfo, SizeOf(_STARTUPINFOA));
  startupinfo.cb:=SizeOf(_STARTUPINFOA);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW;
  startupinfo.wShowWindow:=SW_SHOW;
  if CreateProcessWithLogonW('test', nil, '1248', 0, nil, 'calc.exe', 0, nil, nil, startupinfo, processinformation) then
  begin
    CloseHandle(processinformation.hThread);
    CloseHandle(processinformation.hProcess);
  end else RaiseLastOSError;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Dmitry_DM (07.01.2013)
  #15  
Старый 07.01.2013, 13:50
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Спасибо большое! Я совсем немного переделал вот так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   FileName : PWideChar;
implementation

{$R *.dfm}

function CreateProcessWithLogonW(
    lpUsername: LPCWSTR;
    lpDomain: LPCWSTR;
    lpPassword: LPCWSTR;
    dwLogonFlags: DWORD;
    lpApplicationName: LPCWSTR;
    lpCommandLine: LPWSTR;
    dwCreationFlags: DWORD;
    lpEnvironment: Pointer;
    lpCurrentDirectory: LPCWSTR;
    const lpStartupInfo: _STARTUPINFOA;
    var lpProcessInfo: _PROCESS_INFORMATION
  ): Boolean; stdcall; external 'Advapi32.dll';
 
procedure TForm1.Button1Click(Sender: TObject);
var
  startupinfo: _STARTUPINFOA;
  processinformation: _PROCESS_INFORMATION;
begin
  ZeroMemory(@startupinfo, SizeOf(_STARTUPINFOA));
  startupinfo.cb:=SizeOf(_STARTUPINFOA);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW;
  startupinfo.wShowWindow:=SW_SHOW;
  if OpenDialog1.Execute then
  Edit1.Text:=OpenDialog1.FileName;
  FileName := PWideChar(WideString(Edit1.Text));

  if CreateProcessWithLogonW('Гость', nil, '', 0, nil, FileName, 0, nil, nil, startupinfo, processinformation) then
  begin
    CloseHandle(processinformation.hThread);
    CloseHandle(processinformation.hProcess);
  end else RaiseLastOSError;
end;


end.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025