Windows servis uygulamasının windows kapanırkan engel olması
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Windows servis uygulamasının windows kapanırkan engel olması
Bu tamamen ayrı bir konu olduğu için farklı bir soru olarak sormanız bence daha faydalı olur.
There's no place like 127.0.0.1
Re: Windows servis uygulamasının windows kapanırkan engel olması
Merhaba Arkadaşlar !
Uzun süren bir çalışmadan sonra sorunu çözdüm. Aşağıdaki fonksiyonu son gönderdiğim mesajdaki WTSQueryUserToken fonksiyonunun ikici parametresi olarak kullanmak gerekiyor. Büyük bir ihtimal ile; server da aynı anda birden fazla bilgisayar ile birden fazla oturum açılabildiği için böyle bir yöntem gerekiyor. (Servisten exe çalıştırma yöntemi) Herkese iyi çalışmalar.
Uzun süren bir çalışmadan sonra sorunu çözdüm. Aşağıdaki fonksiyonu son gönderdiğim mesajdaki WTSQueryUserToken fonksiyonunun ikici parametresi olarak kullanmak gerekiyor. Büyük bir ihtimal ile; server da aynı anda birden fazla bilgisayar ile birden fazla oturum açılabildiği için böyle bir yöntem gerekiyor. (Servisten exe çalıştırma yöntemi) Herkese iyi çalışmalar.
Kod: Tümünü seç
type
WTS_SESSION_INFO = record
SessionId: DWORD;
pWinStationName: PCHAR;
State: DWORD;
end;
PWTS_SESSION_INFO = ^WTS_SESSION_INFO;
PPWTS_SESSION_INFO = ^PWTS_SESSION_INFO;
WTS_SESSION_INFO_ARRAY = array [0 .. 0] of WTS_SESSION_INFO;
PWTS_SESSION_INFO_ARRAY = ^WTS_SESSION_INFO_ARRAY;
function WTSEnumerateSessionsA(hServer: THandle; Reserved, Version: DWORD;
ppSI: PPWTS_SESSION_INFO; pCount: PDWORD): boolean;
stdcall external 'Wtsapi32.dll';
function WTSQueryUserToken(SessionId: DWORD; phToken: PHANDLE): boolean;
stdcall external 'Wtsapi32.dll';
function WTSFreeMemory(pSi: Pointer): boolean;
stdcall external 'Wtsapi32.dll';
.
.
.
.
function GetCurrentUserToken: THandle;
var
hToken: THandle;
pSi: PWTS_SESSION_INFO;
pSiA: PWTS_SESSION_INFO_ARRAY;
Count, i: DWORD;
begin
hToken := 0;
Result := 0;
pSi := nil;
Count := 0;
// Oturum Listesi alınıyor
WTSEnumerateSessionsA(0, 0, 1, @pSi, @Count);
pSiA := PWTS_SESSION_INFO_ARRAY(pSi);
// aktif oturumu bul
for i := 0 to Count - 1 do
begin
if pSiA[i].State = 0 then
begin
// aktif oturuma yönlendiriliyor
if WTSQueryUserToken(pSiA[i].SessionId, @hToken) then
DuplicateTokenEx(hToken, TOKEN_ASSIGN_PRIMARY or TOKEN_ALL_ACCESS, nil,
SecurityImpersonation, TokenPrimary, Result);
Break;
end;
end;
WTSFreeMemory(pSi);
end;