Avatar billede nop Nybegynder
13. februar 2008 - 09:02 Der er 3 kommentarer og
1 løsning

Process liste med bruger

I forbindelse med et program der kører på både Citrix og terminal server, er der opstået et problem.
Når programmet starter skal det chekke om andre instanser af sig selv kører og lukke dem. Det virker fint på enkelt bruger systemer.
Men på Terminal server vil det prøve at lukke de andre brugeres programmer, med en fejl til følge - fordi jeg ønsker at gøre brugeren opmærksom at en instance (som er hans egen) ikke svarer mere.
Hvordan tester jeg om det er en process som er brugerens egen, eller tilhører en anden bruger?

procedure killMe;
var
    bContinue:    BOOL;
    Ret:         BOOL;
    Ph:         THandle;
    sh:         THandle;
    pe:         TProcessEntry32;
    n:            string;
    myID:        Dword;
begin
    sh:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    pe.dwSize:=SizeOf(pe);
    bContinue:=Process32First(sh, pe);
    n:=AnsiLowerCase(ExtractFileName(Application.ExeName));
    GetWindowThreadProcessID(Application.Handle, @myID);
    while Integer(bContinue) <> 0 do begin
        if AnsiLowerCase(pe.szExeFile) = n then begin
            if myID<>pe.th32ProcessID then begin
                Ph:=OpenProcess(1, BOOL(0), pe.th32ProcessID);
                Ret:=TerminateProcess(Ph, 0);

            if false then //er blevet nød til at false testen ud ellers brokker den sig over at den ikke kan stoppe andre brugeres processer.
                if not ret then begin
                    MessageDlg('Could not terminate the running process, contact the system administrator.', mtError, [mbok],0)
                    halt;
                end;
            end;
        end;
        bContinue:=Process32Next(sh, pe);
    end;
    CloseHandle(sh);
end; //kill me
Avatar billede hrc Mester
13. februar 2008 - 09:13 #1
Jeg har nedenstående kode i min DPR-fil. Det er den klassiske enkelt-instans tingest, men den kan du modificere så brugerens login/ID er en del af det token der skal angives. På den måde kan samme bruger kun starte én instans af programmet.

.. tror jeg nok. Er det noget du kan bruge?

var
  mHandle: THandle;
begin
  //{$WARNINGS OFF}
  mHandle := CreateMutex(nil, True, <token>);
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    Showmessage('Programmet er allerede startet');
    exit;
  end;
  //{$WARNINGS ON}
Avatar billede hrc Mester
13. februar 2008 - 09:14 #2
Alternativt tror jeg det er noget med IPC og hvor din program må spørge de andre instanser om hvem de er.
Avatar billede nop Nybegynder
13. februar 2008 - 09:23 #3
Jeg har brugt ovenstående, men jeg vil ikke afslutte det program som startes, men det som allerede er startet, jeg kender ikke caption, da den kan skifte, og det er ikke sikkert den tager wm_close heller, derfor må jeg finde processen's PID osv.

Faktisk har jeg noget VB kode som kan bruges. Men er der ikke nogen der har det i Delphi?

http://support.microsoft.com/kb/253140
+til test om er på terminal server:

Private Type OSVERSIONINFOEX
  dwOSVersionInfoSize As Long
  dwMajorVersion As Long
  dwMinorVersion As Long
  dwBuildNumber As Long
  dwPlatformId As Long
  szCSDVersion(1 To 128) As Byte ' Maintenance string for PSS usage
  wServicePackMajor As Integer
  wServicePackMinor As Integer
  wSuiteMask As Integer
  bProductType As Byte
  bReserved As Byte
End Type

Private Const VER_SUITE_TERMINAL As Long = &H10
Private Const VER_NT_SERVER As Long = &H3

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA"
( _
    lpVersionInformation As OSVERSIONINFOEX) As Long

Public Function RunningInTerminalServer() As Boolean
  Dim osInfo As OSVERSIONINFOEX

  osInfo.dwOSVersionInfoSize = LenB(osInfo)
  Call GetVersionEx(osInfo)

  If ((osInfo.bProductType And VER_NT_SERVER) <> 0) And _
      ((osInfo.wSuiteMask And VER_SUITE_TERMINAL) <> 0) Then
      ' OK, the machine is terminal server capable, but am I running inside
such a session...?

      If (LCase(VBA.Left(Environ$("SESSIONNAME"), 3)) = "rdp") Then
        ' Yes, I am
        RunningInTerminalServer = True
      End If
  End If
End Function
Avatar billede nop Nybegynder
18. januar 2009 - 17:41 #4
Jeg har fundet ud af det meste - selv!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

IT-Sikkerhedsrådgiver til Cyberdivisionen i Hvidovre

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Nye kolleger søges til IT Stab i Forsvaret

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger elementleder til System sektionen i Hvidovre