![]() |
|
|
Регистрация | << Правила форума >> | 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. |