Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lívio Bruno

[Resolvido] CreateProcessAsUser

Recommended Posts

Olá pessoal,

 

estou com o seguinte código:

 

procedure RunAs(ACommandLine, AUserName, ADomain, APassword: PAnsiChar);

var

hToken: Cardinal;

ProcessInfo: TProcessInformation;

StartupInfo: TStartupInfo;

 

function SetUserObjectFullAccess(hUserObject: THandle): Boolean;

var

Sd: PSecurity_Descriptor;

Si: Security_Information;

begin

Sd := Ptr(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));

InitializeSecurityDescriptor(Sd, SECURITY_DESCRIPTOR_REVISION);

SetSecurityDescriptorDacl(Sd, True, nil, False);

 

Si := DACL_SECURITY_INFORMATION;

Result := SetUserObjectSecurity(hUserObject, Si, Sd);

 

LocalFree(HLOCAL(Sd));

end;

begin

Win32Check(LogonUser(AUserName, ADomain, APassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken));

try

ImpersonateLoggedOnUser(hToken);

try

SetUserObjectFullAccess(GetThreadDesktop(GetCurrentThreadId));

SetUserObjectFullAccess(GetProcessWindowStation);

 

ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));

StartupInfo.cb := SizeOf(TStartupInfo);

StartupInfo.wShowWindow := SW_SHOW;

 

 

if not CreateProcessAsUser(hToken, nil, ACommandLine, nil, nil,

False, CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,

nil, nil, StartupInfo, ProcessInfo) then

RaiseLastOsError;

finally

RevertToSelf;

end;

finally

CloseHandle(hToken);

end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

RunAs('C:\WINDOWS\notepad.exe','MEU_USUARIO',nil, 'MINHA_SENHA');

end;

 

Mas ta retornando o seguinte erro na hora de compilar:

 

[Warning] Unit1.pas(51): Symbol 'Win32Check' is specific to a platform.

 

O programa roda, mas na hora de executar outro com privilégios de administrador retorna outro erro:

 

System Error. Code 1314. O cliente não tem o privilégio necessário.

 

Será que alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom gente... resolvi o problema... pra executar um aplicativo como outro usuario do computador, faz-se o seguinte...

 

function CreateProcessWithLogon(lpUsername: PWideChar;

lpDomain: PWideChar;

lpPassword: PWideChar;

dwLogonFlags: DWORD;

lpApplicationName: PWideChar;

lpCommandLine: PWideChar;

dwCreationFlags: DWORD;

lpEnvironment: Pointer;

lpCurrentDirectory: PWideChar;

var lpStartupInfo: TStartupInfo;

var lpProcessInfo: TProcessInformation): BOOL; stdcall;

external 'advapi32' name 'CreateProcessWithLogonW';

 

function CreateEnvironmentBlock(var lpEnvironment: Pointer;

hToken: THandle;

bInherit: BOOL): BOOL; stdcall; external 'userenv';

 

function DestroyEnvironmentBlock(pEnvironment: Pointer): BOOL; stdcall; external 'userenv';

 

const

LOGON_WITH_PROFILE = $00000001;

 

 

//Emulate the RunAs function

 

 

function RunAs(User, Password, Command: String): Integer;

var dwSize: DWORD;

hToken: THandle;

lpvEnv: Pointer;

pi: TProcessInformation;

si: TStartupInfo;

szPath: Array [0..MAX_PATH] of WideChar;

begin

 

ZeroMemory(@szPath, SizeOf(szPath));

ZeroMemory(@pi, SizeOf(pi));

ZeroMemory(@si, SizeOf(si));

si.cb:=SizeOf(TStartupInfo);

 

if LogonUser(PChar(User), nil, PChar(Password), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then

begin

if CreateEnvironmentBlock(lpvEnv, hToken, True) then

begin

dwSize:=SizeOf(szPath) div SizeOf(WCHAR);

if (GetCurrentDirectoryW(dwSize, @szPath) > 0) then

begin

if (CreateProcessWithLogon(PWideChar(WideString(User)), nil, PWideChar(WideString(Password)),

LOGON_WITH_PROFILE, nil, PWideChar(WideString(Command)), CREATE_UNICODE_ENVIRONMENT,

lpvEnv, szPath, si, pi)) then

begin

result:=ERROR_SUCCESS;

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

end

else

result:=GetLastError;

end

else

result:=GetLastError;

DestroyEnvironmentBlock(lpvEnv);

end

else

result:=GetLastError;

CloseHandle(hToken);

end

else

result:=GetLastError;

 

end;

 

 

Aí você usa assim:

 

RunAs('usuario', 'senha', 'aplicativo_que_quer_executar');

 

Bom... Té mais... espero ter ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.