Das Notes Forum

Lotus Notes / Domino Sonstiges => Tipps und Tricks => Thema gestartet von: eknori am 31.03.02 - 11:56:16

Titel: Systeminformationen (API)
Beitrag von: eknori am 31.03.02 - 11:56:16
Hallo zusammen,

Deepsee hatt in einem früheren Thread einmal nach der Möglichkeit gefragt, Systeminformationen auszulesen.

Ich habe hier einmal eine kleine Klasse zusammengebaut, die folgende Informationen ermittelt

-Werden kleine Schriftarten verwendet
-Ist eine Soundkarte installiert
-Anzahl Farben
-Tastatur Typ
-Anzahl Funktionstasten
-Hostname
-IP Adresse des Host
-aktuelle Bildschirmauflösung
-CPU Takt
-Anzahl Processoren
-Prozessor Typ
-Prozessor Build Level
-Prozessor Revision
-Betriebssystem
-Windows Systemverzeichnis
-Notes Verzeichnis
-Welche COM Ports sind verfügbar

Ich habe die Klasse unter Windows 2000 entwickelt und getestet. Gebt mir doch bitte einmal ein Feedback, wie es unter anderen OS aussieht.

Selbstverständlich sind das noch nicht alle Informationen, die man auslesen kann. Welche Funktionen soll ich noch einbauen ?

http://www.eknori.de/downloads/cSysInfo.zip

eknori
Titel: Re: Systeminformationen (API)
Beitrag von: Christopher am 31.03.02 - 13:55:03
Hallo Ulrich,

Hut ab wirklich gute arbeit gefällt mir gut. Ich suche noch die möglickkeit über API WIN200 bzw. XP zu beenden.

Hast Du noch was im Zauberkasten?

Viele Grüße

Osterhasi

Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 31.03.02 - 14:10:58
Hallo Christopher,

das Thema hatten wir ja schon mal. Die "alten" API Calls funktionieren leider nicht in W2K.
Leider habe ich im Moment da nix auf Lager ( selbst rundll32.exe user.exe, ExitWindows funktioniert nicht unter 2000).
Aber ich bleibe dran.


eknori.

Titel: Re: Systeminformationen (API)
Beitrag von: NotesBug am 02.04.02 - 09:40:03
Ich habe zwar keine Ahnung von API Calls, aber beenden kann man alle MS Betriebssysteme sehr gut mit shutdown.exe aus dem Resource Kit.
Wenn man eine kleine Batch Datei schreibt, kann man da auch mit 'load shutdown.bat' sehr einfach aus der entfernung einen Server komplett beenden.

Wenn man adminrechte auf dem entfernten Rechner hat, muß man die Datei nicht einmal dort ablegen, sondern man kann aus der Entfernung den Rechner anschiessen.

Hat man keine Adminrechte auf dem NT Rechner, aber Rechte auf dem Notes server, kann man mit einem Server Agenten dort zwei Dateien (shutdown.exe und die Batch Datei)ablegen und dann über die Konsole oder einen weiteren Agenten die batch ausführen und den Server abschiessen. (Das funktioniert deshalb so gut, weil der Notes Server meistens mit System Rechten als Dienst gestartet wird.)
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 02.04.02 - 11:33:47
Hallo NotesBug,

sicher, hast recht. Kann man auch damit lösen. Ich habe da aber einen anderen Ansatz im Sinn. Ich möchte gerne ohne externe Programme auskommen. Das bedeutet wieder einen Zusatzaufwand bei der Softwareverteilung. Zudem weiß man nicht, welche Nebenwirkungen solche zusätzlichen Programme habe; da habe ich das lieber selbst in der Hand.
In meinem Fall ist das auch nur ein theoretischer Ansatz, Christopher hat da Bedarf. Also Christopher, kannst es ja mal mit shutdown.exe  versuchen. Möglicherweise löst das dein Problem mit einfachen Mitteln.

eknori
Titel: Re: Systeminformationen (API)
Beitrag von: manuel am 02.04.02 - 12:02:30
Ich hab' da noch was:

Standard-Drucker ermitteln
Code

Private Declare Function GetProfileString Lib "kernel32" _
       Alias "GetProfileStringA" (ByVal lpAppName As String, _
       ByVal lpKeyName As String, ByVal lpDefault As String, _
       ByVal lpReturnedString As String, ByVal nSize As Long) _
       As Long


Private Sub GetStdPrinterName()
 Dim PrinterName$, Driver$, Port$
 Dim Buffer$, r&, X&, Y&
   
   Buffer = Space(8192)
   r = GetProfileString("windows", "Device", "", Buffer, Len(Buffer))
   If r Then
     Buffer = Mid(Buffer, 1, r)
     X = InStr(Buffer, ",")
     PrinterName = Mid(Buffer, 1, X - 1)
     Y = InStr(X + 1, Buffer, ",")
     Driver = Mid(Buffer, X + 1, Y - X - 1)
     Port = Mid(Buffer, Y + 1)
   Else
     PrinterName = "?"
     Driver = "?"
     Port = "?"
   End If
End Sub



oder eine VolumeInformation

Code

Private Declare Function GetVolumeInformation& Lib "kernel32" _
       Alias "GetVolumeInformationA" (ByVal lpRootPathName _
       As String, ByVal pVolumeNameBuffer As String, ByVal _
       nVolumeNameSize As Long, lpVolumeSerialNumber As Long, _
       lpMaximumComponentLength As Long, lpFileSystemFlags As _
       Long, ByVal lpFileSystemNameBuffer As String, ByVal _
       nFileSystemNameSize As Long)

Const MAX_FILENAME_LEN = 256


Public Function SerNum(Drive$) As Long
 Dim No&, S As String * MAX_FILENAME_LEN
   Call GetVolumeInformation(Drive & ":\", S, MAX_FILENAME_LEN, _
                             No, 0&, 0&, S, MAX_FILENAME_LEN)
   SerNum = No
End Function



CD-Fach öffnen/schließen

Code

Private Declare Function mciExecute Lib "winmm.dll" _
          (ByVal lpstrCommand As String) As Long

 ' Laufwerkstür öffnen
 Call mciExecute("Set CDaudio door open")

 ' Laufwerkstür schließen
 Call mciExecute("Set CDaudio door closed")



Dauer seit Anmeldung

Code

Private Declare Function GetTickCount Lib "kernel32" () As Long


 Dim H As Single, M As Single, S As Single, MS As Single
 Dim strH$, strM$, strS$, strMS$
   MS = GetTickCount()
   MS = MS / 1000
   
   H = Int(MS / 3600)
   MS = MS - H * 3600
   M = Int(MS / 60)
   MS = MS - M * 60
   S = Int(MS)
   MS = Int((MS - S) * 10)
   
   strH = CStr(H)
   strM = Format(CStr(M), "##00")
   strS = Format(CStr(S), "##00")
   strMS = CStr(MS)
   'lblTime.Caption = strH & ":" & strM & ":" & strS & ":" & strMS
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 02.04.02 - 12:25:46
Danke dir. Die Sache mit dem Standarddrucker funktioniert in deinem Fall leider nur unter Win 9x, da Win NT und 2000 die Informationen in der Registry ablegen.
Die VolInformation habe ich bereits implementiert

- Seriennummer
- Volumenname
- FileSystem

des Laufwerks

außerdem habe ich noch Funktionen zur Ermittllung verschiedener Parameterwerte des Arbeitsspeichers eingebaut. Wenn ich die Tests heute noch schaffe, stelle ich die neue Version auf meinen Server.

Wegen der Drucker habe ich noch ein anderes Projekt am Laufen.
Ich bin dabei eine neue Klasse zu schreiben, die es ermöglicht, den Standarddrucker temporär per LS zu wechseln, um z.B. NotesDokumente oder Attachments in das PDF Format umzuwandeln.
Ist aber nicht so einfach, weil, wie schon gesagt, die Infos zum Drucker nicht konsistent über alle Windows Versionen an einer Stelle stehen.
Ist ein ganz schöner Brocken, das kann ich sagen.

eknori
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 02.04.02 - 14:22:50
@All

habe gerade eine neue Version hochgeladen.

folgende Funktionen sind hinzugekommen.

Grösse des Arbeitsspeichers ermitteln
grösse des virtuellen ASrbeitsspeichers ermitteln
Seriennummer der Festpaltte
Dateisystem
Volume Name der Festplatte

und für Christopher noch die Funktionen
zum

shutdown
reboot
logoff und
poweroff

unter Windows 2000

zusätzlich noche eine Funktion zum Sperren der Workstation ( nur für W2K )

bei der Reboot funktion habe ich im ActionButton der Ansicht eine Sperre eingebaut. (der code ist gnadenlos, daher bitte vorher alle anderen Anwendungen schließen !!! )

probiert es mal aus und gebt mir bitte ein Feedback, ob irgendwelche unbeabsichtigten Fehlermeldungen auftauchen.

bisher bekannte Fehler :

die Funktion zur ermittlung der Soundkarte scheint irgendwie den Stack durcheinander zu bringen. Wenn man dann die IP des Host ermitteln will, crasht Notes.


viel Spaß beim Testen.

eknori
Titel: Re: Systeminformationen (API)
Beitrag von: manuel am 02.04.02 - 14:37:22
Ich habe folgende Fehlermeldung bekommen:
Cannot find external name: GETREGISTEREDOWNER


Die Funktion ist auch nirgends deklariert!
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 02.04.02 - 14:39:57
Stimmt, ist noch in dem AktionButton als Funktionsaufruf enthalten.
Habe ich aber vorerst aus der Klasse verbannt.

Habs nochmal neu hochgeladen
Titel: Re: Systeminformationen (API)
Beitrag von: manuel am 02.04.02 - 15:22:19
Wie versprochen:

Code

Declare Function InternetGetConnectedState Lib "wininet.dll" (lpSFlags As Long, Byval dwReserved As Long) As Long

Const INTERNET_CONNECTION_LAN = &H2
Const INTERNET_CONNECTION_MODEM = &H1
Const INTERNET_CONNECTION_PROXY = &H4
Const INTERNET_CONNECTION_MODEM_BUSY = &H8



Code

Sub Click(Source As Button)
     Dim icFlags As Long
     
     Call InternetGetConnectedState(icFlags, 0&)
     
     Msgbox Out(icFlags, INTERNET_CONNECTION_LAN), 0, "Verbunden via LAN"
     Msgbox Out(icFlags, INTERNET_CONNECTION_MODEM), 0, "Verbunden via Modem"
     Msgbox Out(icFlags, INTERNET_CONNECTION_PROXY), 0, "Verbunden via Proxy"
     Msgbox Out(icFlags, INTERNET_CONNECTION_MODEM_BUSY), 0, "Modem ist gerade aktiv"
End Sub


Function Out(Byval icFlags&, Byval Flag&) As String
     If Flag And icFlags Then
           Out = "Ja"
     Else
           Out = "Nein"
     End If
End Function
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 02.04.02 - 15:24:06
Danke dir, werde es gleich mal einbauen
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 02.04.02 - 15:36:38
Habs est mal so als Sub eingebaut; mach morgen noch eine FUnktion daraus
Titel: Re: Systeminformationen (API)
Beitrag von: Silvio am 19.04.02 - 10:09:06
Re: zu Geschrieben am: 02.04.02 um 12:25:46
Ich habe schon ein paar Jahre VB3,4,5 auf dem Buckel, aber den Std-Drucker umschalten per LS habe ich (auch noch) nicht hingekriegt. Wie du möchte ich auch zu PDF umschalten und ein Dok erstellen und wieder zurück. Leider scheitert es daran dass Notes die Info nicht von W2k erhält oder diese selbst nicht verfolgt.
Das einzige was ich nach der Std-Drucker Umstellung in W2k (noch) nicht versucht habe ist den Notes-Client ein weiteres mal zu starten und hoffen das dieser den PDF Drucker anzieht. => Setzt eine eigene Notes.INI vorraus. Benötigt ein wenig mehr Speicher aber sollte funktionieren.
Im schlimmsten Fall musst du die Notes C-API ansprechen.

Silvio
Titel: Re: Systeminformationen (API)
Beitrag von: eknori am 19.04.02 - 10:16:39
Ne ne, das geht schon mit LS und ein bisschen API Programmierung. Die Vorgehensweise ist mir im Prinzip auch schon klar, bin nur leider noch nicht dazu gekommen, das konsequent umzusetzen.

Zum Thema PDF guck doch mal hier

http://www.atnotes.de/cgi-bin/yabb/YaBB.pl?board=002-3;action=display;num=1019112400