AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Nachricht auf allen Desktops anzeigen - und wieder schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Nachricht auf allen Desktops anzeigen - und wieder schließen

Ein Thema von xpmd · begonnen am 21. Jul 2008 · letzter Beitrag vom 24. Jul 2008
Antwort Antwort
Seite 2 von 3     12 3      
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#11

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 23. Jul 2008, 08:17
Wie gesagt, ein Prozess kann nicht das Token eines anderern Prozesses nachträglich ersetzen unter Vista. Es gibt eine 5.

Wenn die SessionID gesetzt wurde und der Prozess läuft, liefert SetTokenInformation einen Fehler zurück.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
new32

Registriert seit: 10. Mai 2005
160 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 23. Jul 2008, 09:29
Danke für den Hinweis!

Eines meiner Programme benutzt nämlich ZwSetInformationProcess um sein Token mit bestimmten Rechten auszustatten.
Und tatsächlich Vista sagt nur c0000005 dazu.
~?&/%§$§%\&?~
8)
  Mit Zitat antworten Zitat
xpmd

Registriert seit: 8. Jul 2008
9 Beiträge
 
#13

geschafft

  Alt 23. Jul 2008, 10:50
Zitat von Apollonius:
Die Ansätze 1 und 3 können gar nicht funktionieren: Die TS eines Prozesses kann nicht geändert werden.
Der Ansatz 2 ist korrekt. Hast du in der StartupInfo-Struktur Desktop und Window-Station angegeben? Hast du im Token die SessionID gesetzt?
Danke! Habs jetzt mit Ansatz 2 umgesetzt und so klappts auch. Das Setzen der WindowStation/Desktop für den Prozessstart ist gar nicht nötig.
Das Programm startet sich 1x pro Terminal Session mit dem Parameter STOPX selbst. Durch den Start mit diesem Parameter werden im entsprechenden Kontext alle Fenster der entsprechenden Session durchlaufen.

Da die WTSSendMessage MB_SERVICE_NOTIFICATION nun auch die MessageBox im Login-Screen und beim "gesperrtem" Bildschirm anzeigt, muss ich es noch irgendwie schaffen an diese Fenster zu kommen. Ich lasse vom Hauptprozess unter Session0 / System nochmal zusätzlich alle verfügbaren WindowStations und Desktops nach der MessageBox durchsuchen. Allerdings wird sie nicht gefunden. Ich werde da noch probieren, einen zusätzlichen Prozess unter expliziter Angabe der WinSta0\Winlogon und WinSta0\Disconnect zu starten.

Delphi-Quellcode:
for i := 0 to Length(SessionInfos) - 1 do begin
  UserToken := QueryUserToken(SessionInfos[i].SessionId);
  ZeroMemory(@SI, SizeOf(SI));
  ZeroMemory(@PI, SizeOf(PI));
  
  SI.lpDesktop := nil;
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_HIDE;
  SI.cb := SizeOf(si);
  
  DuplicateTokenEx(UserToken, MAXIMUM_ALLOWED, nil, SecurityImpersonation, TokenPrimary, DuplicatedToken);
  if(DuplicatedToken <> 0) then begin
    SetTokenSessionId(DuplicatedToken, SessionInfos[i].SessionId);
    CreateProcessAsUser(DuplicatedToken,PAnsiChar(ParamStr(0)) , PAnsiChar(ParamStr(0) + ' STOPX'), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, SI, PI);
  end;
  CloseHandle(UserToken);
  CloseHandle(DuplicatedToken);
end;
hier der Code für SetTokenSessionId:

Delphi-Quellcode:
{$EXTERNALSYM _SetTokenInformation}
function _SetTokenInformation(TokenHandle: Cardinal; TokenInformationClass: Integer; TokenInformation: PDWORD; TokenInformationLength: DWORD): bool; stdcall;
function SetTokenSessionId(UserToken: Cardinal; SessionId: integer): bool;

implementation

function _SetTokenInformation; external 'Advapi32.dllname 'SetTokenInformation';
function SetTokenSessionId(UserToken: Cardinal; SessionId: integer): bool;
var Information: DWORD;
begin
  Information := DWORD(SessionId);
  result := _SetTokenInformation(UserToken, 12, @Information, Cardinal(SizeOf(Information)));
end;
  Mit Zitat antworten Zitat
xpmd

Registriert seit: 8. Jul 2008
9 Beiträge
 
#14

Re: geschafft

  Alt 23. Jul 2008, 11:46
Zitat von xpmd:
Da die WTSSendMessage MB_SERVICE_NOTIFICATION nun auch die MessageBox im Login-Screen und beim "gesperrtem" Bildschirm anzeigt, muss ich es noch irgendwie schaffen an diese Fenster zu kommen. Ich lasse vom Hauptprozess unter Session0 / System nochmal zusätzlich alle verfügbaren WindowStations und Desktops nach der MessageBox durchsuchen. Allerdings wird sie nicht gefunden. Ich werde da noch probieren, einen zusätzlichen Prozess unter expliziter Angabe der WinSta0\Winlogon und WinSta0\Disconnect zu starten.
Klappt leider nicht.

Unter diesen Desktops werden keine Fenster gefunden. Hat jemand ne Idee wie ich diese auch noch zum schließen bringe?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#15

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 23. Jul 2008, 12:57
Wenn du pro Session eh schon ein Programm hast, dann kannst du die DialogBox auch gleich selbst anzeigen

Schau dir mal an, von welchem Prozess der Dialog angezeigt wird. Wenn der Prozess Systemrechte besitzt, dann wirst du es nicht finden,
wenn deine Suche nicht auch von einem Prozess mit Sysrechten ausgeführt wird.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
xpmd

Registriert seit: 8. Jul 2008
9 Beiträge
 
#16

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 23. Jul 2008, 13:20
Laut den Infos von hier: http://www.uvnc.com/vista/ müsste ich den Schließen-Prozess unter jeder Session am Desktop Winlogon mit SYSTEM-Rechten starten, um auf dessen Fenster zugreifen zu können. Die WTSSendMessage Nachricht wird offenbar von einem Windows-Systemprozess angezeigt. Frage ist jetz wie ich eben einen Prozess z.B. unter Session 2\Winsta0\Winlogon und User SYSTEM starte.

STARTUPINFO lpDesktop auf Winsta0\Winlogon setzen und über SetTokenInformation die Session des UserTokens auf die entsprechende Session setzen würde ich jetzt sagen. Aber wie geht das mit User SYSTEM?

QueryUserToken auf Session 0 liefert einen Token 0 zurück. Diesen dupliziert ergibt auch 0 Entsprechen kann ich keine andere Session über SetTokenInformation setzen und den Schließen-Prozess damit starten. Hat SYSTEM überhaupt ein UserToken? Oder bin ich da auf dem Holzweg?

  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 23. Jul 2008, 13:59
Wenn dein Service als System läuft, hat er auch ein entsprechendes Token. Also kannst du einfach dein Prozess-Token duplizieren und das Duplikat verwenden, nachdem du dort die Session-ID gesetzt hast.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#18

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 23. Jul 2008, 18:17
vorsicht: WTSQueryUserToken liefert unter xp das user token zurück.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
xpmd

Registriert seit: 8. Jul 2008
9 Beiträge
 
#19

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 24. Jul 2008, 14:19
es ist zum verzweifeln

Jetz paßt alles soweit, die MEssageBox wird überall wieder geschlossen bis auf einen Fall: Wenn mehrere Sessions unter Vista aktiv sind, wird das Fenster zwar in jeder session geschlossen. Scheinbar überwacht aber WTSSendMessage jedes Nachrichtenfenster, ob es automatisch geschlossen wird ohne dass es der User sehen konnte. Also quasi Wenn es in einer Session die grad nicht verbunden ist, geschlossen wird. Anders kann ichs mir nicht erklären. Das Fenster wird laut Debug-Outputs geschlossen erscheint aber sofort drauf wieder mit neuem Handle. Irgendwie eine undokumentierte Funktion von WTSSendMEssage?

eine Lösung wüsst ich für den Fall noch. Ich lass den Schließen-Prozess so lange im Kreis laufen bis keine MessageBox mehr existiert. Der prozess läuft quasi dann so lange bis sich der angemeldete Benutzer zu der Session verbindet. Anschließend kann das Fenster dann geschlossen werden.

Echt frustrieren das. Mal sehen obs so dann auch wirklich zu 100% alle existierenden Nachrichtenfenster schließen kann, oder ob der 281 Stolperstein auftaucht
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#20

Re: Nachricht auf allen Desktops anzeigen - und wieder schli

  Alt 24. Jul 2008, 15:02
Warum machst du nicht einfach deinen eigenen MessageBox Prozess?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz