![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! Недавно задался такой задачей. Видел в интернете много примеров реализации, но толком ничего не работает.. Так вот что я хочу: сделать программу на delphi чтобы при нажатии на кнопку открывалось диалоговое окно с выбором exeшника и оно запускало эту программу используя имя и пароль админа (они известны). Я хочу один раз их вбить в программу и пользоваться.. Как такое реализовать, помогите!
|
|
#2
|
|||
|
|||
|
Мне кажется, что надо копать в сторону CreateProcessEx и соотв. SecurityDescriptor'a...
|
|
#3
|
|||
|
|||
|
Я вот пытался что-то сделать, но чего-то не работает.. может посоветуете что-нибудь?
|
|
#4
|
|||
|
|||
|
Ну что, знает кто-нибудь как решить эту задачу? Теоретически это не трудно..но я не могу понять почему, к примеру, моя программа не работает..
|
|
#5
|
||||
|
||||
|
Код:
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
|
|||
|
|||
|
А как к этой процедуре обращаться, и что надо писать в uses что бы программа понимала типы переменных, которые используются в этой процедуре?
|
|
#7
|
||||
|
||||
|
Код:
uses
ShellAPI, Windows,
...
begin
RunAsAdministrator('c:\Windows\notepad.exe');
end; |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Dmitry_DM (06.01.2013)
| ||
|
#8
|
|||
|
|||
|
Спасибо! с этим понятно.. а куда вбивать логин и пароль админа?
|
|
#9
|
|||
|
|||
|
Оно работает, у меня на компьютере, где я и так админ. А там, где я буду юзером с ограниченными правами, оно запустит программу от имени администратора?
|
|
#10
|
|||
|
|||
|
Я уже проверил.. Оно в диспетчере задач как было от гостя запуск, так и осталось.. А вот так как TC делает, можно так? Только не вводя имя и пароль админа, а в delphi проекте вбить эти данные.
|
|
#11
|
|||
|
|||
|
Dmitry_DM
чтото самому проверять влом (создавать учётку юзерскую) попробуй в строку shExecInfo^.lpParameters := ''; которую показал NumLock вместо пробела впиши параметры(логин и пароль) в формате, в которм они в командную строку вписываются по команде runas для инофрмации юзай cmd runas/? |
|
#12
|
|||
|
|||
|
хм походу так не получиться, по правилам безопасности команда runas не принимает пароль.только логин,а пароль запрашивается уже после ввода команды
|
|
#13
|
|||
|
|||
|
Цитата:
Код:
shExecInfo^.lpParameters := 'user:Lenovo'; |
|
#14
|
||||
|
||||
|
Код:
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
|
|||
|
|||
|
Спасибо большое! Я совсем немного переделал вот так:
Код:
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. |