Windows servis uygulamasının windows kapanırkan engel olması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Windows servis uygulamasının windows kapanırkan engel olması

Mesaj gönderen SimaWB »

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
erolturk
Üye
Mesajlar: 14
Kayıt: 13 May 2016 04:49

Re: Windows servis uygulamasının windows kapanırkan engel olması

Mesaj gönderen erolturk »

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.

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;
Cevapla