Autor Thema: Externes Programm erkennen  (Gelesen 5045 mal)

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Externes Programm erkennen
« am: 07.11.02 - 10:33:00 »
Hallo,

ich habe unter Windows eine Anwendung die zu einem bestimmten Zeitpunkt Notes zusammen mit einer bestimmten DB startet. Im Datenbankscript dieser DB wird dann sofort ein Agent gestartet. Dieser Agent soll natürlich nur gestartet werden wenn die besagte Datenbank durch das externe Progrsamm aufgerufen wird und nicht wenn diese DB ganz normal vom Anwender im Notes-Client geöffnet wird. Das Script müßte also erkennen ob die externe Anwendung gestartet ist oder nicht und davon den weiteren Start des Agenten abhängig machen. Meine Idee wäre das aus der Registry auszulesen - nur gibt es da einen Eintrag der auf gestartete Programme hinweist? Oder gibt es noch einen anderen Weg das externe Programm zu indentifizieren?

Gruß aus Berlin
Christian
IBM Lotus Notes & Domino Senior Consultant

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re:Externes Programm erkennen
« Antwort #1 am: 07.11.02 - 10:44:22 »
kannst du relativ einfach machen, indem du in die Processliste siehst.

http://www.eknori.de/tips/process.htm

Jetzt musst du nur mal dein Programm starten und in der Prozessliste nachschauen, wie das dort gena heißt. Das übergibst du dann der Funktion als Parameter.

Wenn das Programm gestartet ist liefert die Funktion ein TRUE zurück ansonsten FALSE.

eknori
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Till_21

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • I love Germany
Re:Externes Programm erkennen
« Antwort #2 am: 07.11.02 - 10:49:51 »
- nur gibt es da einen Eintrag der auf gestartete Programme hinweist? Oder gibt es noch einen anderen Weg das externe Programm zu indentifizieren?

es gibt keinen eintrag, der darauf hinweist, du könntest dir aber einen schreiben...
scheib dir einen key in die registry, und pruef im queryopen der db ob er existend ist. falls ja, trigger den agenten und loesch den key aus der registry.
das wäre eine loesung, vorrausgesetzt du bist author deines tools / hast den quellcode vorliegen.

gruss till

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Re:Externes Programm erkennen
« Antwort #3 am: 07.11.02 - 11:26:20 »
Leider kann ich das Tool nicht verändern, ansonsten die Idee ist gut. Das es so nicht in der Registry steht habe ich zwischenzeitlich auch schon rausgefunden, Dein Ansatz könnte das aber ändern. Werde den Vorschlag von eknori weiterverfolgen...Danke!
IBM Lotus Notes & Domino Senior Consultant

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Re:Externes Programm erkennen
« Antwort #4 am: 07.11.02 - 12:33:22 »
Danke eknori, Deine Lösung war genau richtig. Habe das implementiert und es funktioniert wie gewünscht! :D
IBM Lotus Notes & Domino Senior Consultant

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Re:Externes Programm erkennen
« Antwort #5 am: 07.11.02 - 12:53:36 »
Hmm ich war ein bischen zu vorschnell:
Es funktioniert unter XP und 2000 aber nicht unter NT (SP6) ???
eknori hast Du da eine Idee?

Danke Christian
IBM Lotus Notes & Domino Senior Consultant

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re:Externes Programm erkennen
« Antwort #6 am: 07.11.02 - 12:58:10 »
Das Problem ist die function CreateToolhelp32Snapshot in der kernel.dll

die hat man wohl bei NT einfach vergessen

siehe selbst

http://216.26.168.92/vbapi/ref/c/createtoolhelp32snapshot.html

eknori
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Re:Externes Programm erkennen
« Antwort #7 am: 07.11.02 - 13:06:18 »
nicht nur die, auch Process32First und Process32Next wird nicht unterstützt :-\

Hast Du noch eine andere Idee?

Hab noch was gefunden zum Thema unter:
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q187913
« Letzte Änderung: 07.11.02 - 13:11:30 von ikom2 »
IBM Lotus Notes & Domino Senior Consultant

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Re:Externes Programm erkennen
« Antwort #9 am: 08.11.02 - 16:21:29 »
Hallo,

ich habe jetzt bei Microsoft einen Tip gefunden der das unter NT, 2000 und XP möglich macht.

Danke für die Unterstützung!
IBM Lotus Notes & Domino Senior Consultant

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re:Externes Programm erkennen
« Antwort #10 am: 10.11.02 - 16:57:26 »
HMM, kannst mal die URL posten, habe die MSDN durchsucht, aber nix passendes gefunden (jedenfalls nix, was alles kann ); ich sitze nämlich schon den ganzen Sonntag und bastele eine Klasse, die die Prozeßbehandlung unter Win 9x - XP ermöglicht.
(ListProc, IsProcRunning und Terminate)

Das Problem bei NT ist in der Tat die Toolhelp - Geschichte. Da hat man damals die psapi.dll verwendet.

Nun ja, wenn du eine Lösung hast... Ich mache das Ding aber trotzdem noch fertig. Sportliche Herausforderung  ;D

Gruß

Ulrich

hier der Code, den NT Kram kann ich erst morgen in der Firma testen.

Const PROCESS_QUERY_INFORMATION = 1024
Const PROCESS_VM_READ = 16
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const hNull = 0

Const TH32CS_SNAPPROCESS  = 2&
Const MAX_PATH  = 260

Type PROCESSENTRY32
   dwSize As Long
   cntUsage As Long
   th32ProcessID As Long
   th32DefaultHeapID As Long
   th32ModuleID As Long
   cntThreads As Long
   th32ParentProcessID As Long
   pcPriClassBase As Long
   dwFlags As Long
   szExeFile As String * MAX_PATH
End Type

Declare Function CreateToolhelpSnapshot Lib "Kernel32.dll" Alias "CreateToolhelp32Snapshot"

(Byval lFlags As Long, Byval lProcessID As Long) As Long
Declare Function ProcessFirst Lib "Kernel32.dll" Alias "Process32First" (Byval hSnapShot As Long,

uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext Lib "Kernel32.dll" Alias "Process32Next" (Byval hSnapShot As Long,

uProcess As PROCESSENTRY32) As Long
'Declare Sub CloseHandle Lib "Kernel32.dll" (Byval hPass As Long)
Declare Function CloseHandle Lib "Kernel32.dll" (Byval Handle As Long) As Long
Declare Function FindWindow Lib "user32" Alias"FindWindowA" (Byval lpClassName As String, Byval

lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (Byval hwnd As Long, Byval wMsg As

Long, Byval wParam As Long, lParam As Any) As Long

Const WM_CLOSE = &H10

Declare Function EnumProcesses Lib "psapi.dll"  ( lpidProcess As Long, Byval cb As Long,  

cbNeeded As Long) As Long
Declare Function EnumProcessModules Lib "psapi.dll" (Byval hProcess As Long, lphModule As Long,

Byval cb As Long, lpcbNeeded As Long) As Long
Declare Function GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExA" (Byval hProcess

As Long, Byval hModule As Long, Byval lpFileName As String, Byval nSize As Long) As Long
Declare Function GetModuleFileNameExA Lib "psapi.dll" (Byval hProcess As Long, Byval hModule As

Long, Byval strModuleName As String, Byval nSize As Long) As Long
Declare Function GetModuleBaseName Lib "psapi.dll" Alias "GetModuleBaseNameA" (Byval hProcess As

Long, Byval hModule As Long, Byval lpBaseName As String, Byval nSize As Long) As Long
Declare Function OpenProcess Lib "kernel32" (Byval dwDesiredAccess As Long, Byval blnheritHandle

As Long, Byval dwAppProcessId As Long) As Long
Declare Function TerminateProcess Lib "kernel32" (Byval ApphProcess As Long, Byval uExitCode As

Long) As Long

Const VER_PLATFORM_WIN32_NT = 2

Type OSVERSIONINFO
   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long
   szCSDVersion As String * 128
End Type

Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer

Sub Click(Source As Button)
   Msgbox IsWinNT
End Sub

Function ProcessRunning(Byval Filename As String) As Variant

   ' if IsWinNT then ...

   Dim hSnapShot As Long, uProcess As PROCESSENTRY32, RetVal As Long
   
   hSnapShot = CreateToolhelpSnapshot(2&, 0&)
   If hSnapShot = 0 Then Exit Function
   
   uProcess.dwSize = Len(uProcess)
   RetVal = ProcessFirst(hSnapShot, uProcess)
   
   Do While RetVal <> 0
      If Instr(1,Ucase(uProcess.szExeFile), Ucase(Filename), 0 ) > 0 Then
         ProcessRunning = True
         Exit Function
      End If
      RetVal = ProcessNext(hSnapShot, uProcess)
   Loop
   processRunning = False
   Call CloseHandle(hSnapShot)
   
End Function

Function IsWinNT() As Long
   Dim myOS As OSVERSIONINFO
   myOS.dwOSVersionInfoSize = Len(myOS)
   GetVersionExA myOS
   IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function

Sub GetProcessesByIDNT()
   Const lngStartSize = 1000   
   Dim lngArray() As Long
   Dim lngBytesReturned As Long
   Dim lngElements As Long   
   Dim strProcessIDs As String
   Dim lngCounte As Long
   Dim lngErrNum As Long
   Dim strErrDesc As String
   
   Redim lngArray(lngStartSize) As Long
   
   If EnumProcesses(lngArray(0), lngStartSize*4,lngBytesReturned) =0 Then
      
      Msgbox "Halllo"
      
   Else
      lngElements = lngBytesReturned / 4
      If lngElements > 0 Then
         Redim Preserve lngArray(lngElements) As Long
         For lngCounter = 0 To lngElements
            strProcessIDs = strProcessIDs & Cstr(lngArray(lngCounter)) &

Chr(13)
         Next
         Msgbox "Current Process IDs:" & Chr(13) & strProcessIDs, vbOKOnly, " "
      Else
         Msgbox "Failed to retrieve any Process ID information", vbOKOnly +

vbExclamation, " "
      End If
   End If
End Sub

Function WindowsVersion() As String
   tmp = ""      
   Dim OS As OSVERSIONINFO
   Dim ret As Integer
   OS.dwOSVersionInfoSize = 148
   OS.szCSDVersion = Space$(128)
   ret = GetVersionExA( OS )
   
   Select Case OS.dwPlatformId
   Case 1
      Select Case OS.dwMajorVersion
      Case 0: tmp = "Windows 95"
      Case 10: tmp = "Windows 98"
      End Select
   Case 2
      Select Case OS.dwMajorVersion
      Case 3: tmp = "Windows NT 3.51"
      Case 4: tmp = "Windows NT 4.0"
      Case 5 :tmp = "Windows 2000"
      End Select
   Case Else
      tmp = "unknown"
   End Select
   WindowsVersion = tmp
End Function

Function KillApps(strFilePath As String) As Long
   
   If IsWinNT Then KillApps = KillAppsNT(strFilePath): Exit Function
   
   Dim uProcess As PROCESSENTRY32
   Dim rProcessFound As Long
   Dim ProcessID As Long
   Dim hSnapshot As Long
   Dim szExename As String
   Dim i
   Dim exitCode As Long
   Dim myProcess As Long
   Const TH32CS_SNAPPROCESS= 2&
   
   uProcess.dwSize = Len(uProcess)
   hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
   rProcessFound = ProcessFirst(hSnapshot, uProcess)
   Do While rProcessFound
      i = Instr(1, uProcess.szexeFile, Chr(0))
      szExename = Lcase$(Left$(uProcess.szexeFile, i - 1))
      If Right$(szExename, Len(strFilePath)) = Lcase$(strFilePath) Then
         myProcess = OpenProcess(PROCESS_ALL_ACCESS, False,

uProcess.th32ProcessID)
         KillApps = TerminateProcess(myProcess, exitCode)
         Call CloseHandle(myProcess)
         KillApps = True
         Exit Function
      End If
      rProcessFound = ProcessNext(hSnapshot, uProcess)
   Loop
   Call CloseHandle(hSnapshot)
Finish:
End Function

Function StrZToStr(pString As String) As String
   StrZToStr = Left$(pString, Len(pString) - 1)
End Function

Function KillAppsNT(strFilePath As String) As Long
   Dim cb As Long
   Dim cbNeeded As Long
   Dim NumElements As Long
   Dim lProcessIDs() As Long
   Dim cbNeeded2 As Long
   Dim lNumElements2 As Long
   Dim lModules(1 To 200) As Long
   Dim lRet As Long
   
   Dim exitCode As Long
   Dim myProcess As Long
   Dim strModuleName As String
       '
   Dim uProcess As PROCESSENTRY32 'This used only as a null UDT when we call DoAppsAction,

we can't make an optional parameter in a function as UDT !
       'Dim exitCode As Long
       'Dim myProcess As Long
   Dim nSize As Long
   Dim hProcess As Long
       '
   Dim szExename As String
       '
       'Dim AppKill As Boolean
       '
   Dim ProcessID As Long
   Dim r, i, ThreadID
   
   
   
       'Get the array containing the process id's for each process object
   cb = 8
   cbNeeded = 96
   Do While cb <= cbNeeded
      cb = cb * 2
      Redim lProcessIDs(cb / 4) As Long
      lRet = EnumProcesses(lProcessIDs(1), cb, cbNeeded)
   Loop
   NumElements = cbNeeded / 4
   For i = 1 To NumElements
           'Get a handle to the Process
      hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
      Or PROCESS_VM_READ, 0, lProcessIDs(i))
           'Got a Process handle
      If hProcess <> 0 Then
               'Get an array of the module handles for the specified
               'process
         lRet = EnumProcessModules(hProcess, lModules(1), 200, _
         cbNeeded2)
               'If the Module Array is retrieved, Get the ModuleFileName
         If lRet <> 0 Then
            strModuleName = Space(MAX_PATH)
            nSize = 500
            lRet = GetModuleFileNameExA(hProcess, lModules(1), strModuleName,

nSize)
            strModuleName = Left(strModuleName, lRet)
                   ''''''''''''''
                   'Check for the client application running
            szExename = Ucase(strModuleName)
            
            If Right$(szExename, Len(strFilePath)) = Lcase$(strFilePath) Then
               myProcess = OpenProcess(PROCESS_ALL_ACCESS, False,

lProcessIDs(i))
               KillAppsNT = TerminateProcess(myProcess, exitCode)
               Call CloseHandle(myProcess)
               KillAppsNT = True
               Exit Function
            End If
         End If
      End If
           'Close the handle to the process
      lRet = CloseHandle(hProcess)
   Next
   
End Function



Die Funktion KillAppsNT enthält bereits alles, um zu einer neuen Funfktion ProcessRunningNT ungebaut zu werden.

dazu muß einfach nur ab der Zeile

           If Right$(szExename, Len(strFilePath)) = Lcase$(strFilePath) Then
               myProcess = OpenProcess(PROCESS_ALL_ACCESS, False,

lProcessIDs(i))


ProcessRunningNT = True gesetzt werden.

Ich kann das, wie gesagt erst morgen in der Firma testen. sollte aber so funzen.


Hier noch die PSAPI.DLL
« Letzte Änderung: 10.11.02 - 18:00:48 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re:Externes Programm erkennen
« Antwort #11 am: 11.11.02 - 09:50:49 »
Hier die endgültige Funktion ProcessRunning(Filemane as String) as Variant.

Die Funktion unterstützt W9x, NT, W2K und XP ( das konnte ich aber nicht testen)

eknori

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline 2Consultants

  • Aktives Mitglied
  • ***
  • Beiträge: 165
  • Geschlecht: Männlich
  • Don't worry be happy!
Re:Externes Programm erkennen
« Antwort #12 am: 11.11.02 - 12:52:39 »
Ich habe sowas ähnliches und es ebenfalls für aller Windows-Versionen (NT, XP, 2000) via psapi.dll gelöst. Danke für die Unterstützung! ;D
IBM Lotus Notes & Domino Senior Consultant

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz