windows 2003 üzerinde kısıtlı kullanıcı hesaplarında oturum açıldığında yönetimsel yetki isteyen programları çalıştırabilmesi için aşağıdaki CreateProcessWithLogonW API sini baz alan fonksiyon yardımıyla bir ara yazılım oluşturmuştuk, şifreli bir dosyadan yönetici kullanıcı adı şifresi ve domain bilgisi okuyup parametre geçtiğim EXE yi ilgili kullanıcı yetkileriyle başarıyla çalıştırıyordu , foksiyonun tamamı aşağıdaki gibi ;
Kod: Tümünü seç
function CreateProcessWithLogonW(
lpUsername,
lpDomain,
lpPassword:PWideChar;
dwLogonFlags:dword;
lpApplicationName: PWideChar;
lpCommandLine: PWideChar;
dwCreationFlags: DWORD;
lpEnvironment: Pointer;
lpCurrentDirectory: PWideChar;
const lpStartupInfo: tSTARTUPINFO;
var lpProcessInformation: TProcessInformation
): BOOL; stdcall; external 'advapi32.dll';
function RunAsUser(const Filename, Domain, Username, Password: string):
Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
wFilename, wDomain, wUsername, wPassword: PWideChar;
begin
FillChar (StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWNORMAL;
GetMem(wFilename, Length(Filename) * SizeOf(WideChar) +
SizeOf(WideChar));
GetMem(wDomain, Length(Domain) * SizeOf(WideChar) +
SizeOf(WideChar));
GetMem(wUsername, length(Username) * SizeOf(WideChar) +
SizeOf(WideChar));
GetMem(wPassword, length(Password) * SizeOf(WideChar) +
SizeOf(WideChar));
StringToWideChar(Filename, wFilename, Length(Filename) *
SizeOf(WideChar)
+ SizeOf(WideChar));
StringToWideChar(Domain, wDomain, Length(Domain) *
SizeOf(WideChar)
+ SizeOf(WideChar));
StringToWideChar(Username, wUsername, Length(Username) *
SizeOf(WideChar)
+ SizeOf(WideChar));
StringToWideChar(Password, wPassword, Length(Password) *
SizeOf(WideChar)
+ SizeOf(WideChar));
Result := CreateProcessWithLogonW(
wUsername,
wDomain,
wPassword,
0,
wFilename,
nil,
0,
nil,
nil,
StartupInfo,
ProcessInfo);
if Result then begin
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end else
RaiseLastOSError;
FreeMem(wFilename);
FreeMem(wDomain);
FreeMem(wUsername);
FreeMem(wPassword);
end;