Laden...

Outlook Sicherheitsabfrage automatische wegklicken

Erstellt von Peter File vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.993 Views
P
Peter File Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren
Outlook Sicherheitsabfrage automatische wegklicken

Hallo,

ich will die "berüchtigte" Outlook Sicherheitsabfrage loswerden. Ich habe dazu auch 99% der Threads hier gelesen und seit 2 Tagen versuche ich das ganze mit Findwindow Send/PostMessage loszuwerden.
Das ExpressClickYes tool will ich nicht verwenden, stattdessen eine eigene Lösung ins Programm einbauen.

Die Abfrage:
siehe Anhang

Was ich bisher so ausprobiert habe, auch teilweise aus dem Forum kopiert:


public partial class Form1 : Form
{

[DllImport("user32.dll";)]
public static extern int FindWindow(
string lpClassName, // class name
string lpWindowName // window name
);

[DllImport("user32.dll";)]
public static extern bool SetForegroundWindow(
int hWnd
);

[DllImport("user32.dll";)]
public static extern int SendMessage(
int hWnd, // handle to destination window
uint Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
[DllImport("User32.Dll";)]
public static extern IntPtr PostMessage(int hWnd, uint msg, uint wParam, uint lParam);

public const uint VK_RETURN = 0x0D;
public const uint WM_SETFOCUS = 0x0007;
public const uint WM_KILLFOCUS = 0x0008;
public const uint WM_CHAR = 0x0102;
public const uint WM_KEYDOWN = 0x0100;
public const uint VK_RIGHT = 0x27;
public const uint VK_DOWN = 0x28;
public const uint VK_TAB = 0x09;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int hwnd = FindWindow(null, "Microsoft Office Outlook";);
bool FG = SetForegroundWindow(hwnd);

//Funktioniert aber ein einfaches Enter drückt nur auf Abbrechen...

//PostMessage(hwnd, WM_KEYDOWN, 0x0000000D, 0x001C0001); // Enter
//PostMessage(hwnd, WM_CHAR, 0x0000000D, 0x001C0001); // Taste senden

//Funktioniert sehr unzuverlässig, wenn überhaupt

//System.Windows.Forms.SendKeys.Send("%(Z)";);
//System.Windows.Forms.SendKeys.Send("{RIGHT}";);
//System.Windows.Forms.SendKeys.Send("{DOWN}";);
//System.Windows.Forms.SendKeys.Send("{DOWN}";);
//System.Windows.Forms.SendKeys.Send("{DOWN}";);
//System.Windows.Forms.SendKeys.Send("{TAB}";);
//System.Windows.Forms.SendKeys.Send("{ENTER}";);

}

Die Lösung sollte zuverlässig und schnell sein am Ende. Was ich mich frage, wie ich die Checkbox "checke" und bei der Combobox einen Wert auswählen kann, am besten direkt, ohne hoch/runter "gedrücke".

Danke!

2.223 Beiträge seit 2005
vor 15 Jahren

Hallo Peter File,

die frage ist doch warum so kompliziert,

einerseits köntest du das irgendwo in der registry ausschalten

oder mal nach extended mapi suchen (hier oder google)

mfg

1.378 Beiträge seit 2006
vor 15 Jahren

Es gibt ein Programm, dass genau dieses Problem(etwas dürftig) umgeht: ClickYes klickt wie der Name schon sagt immer auf Yes wenn das Popup erscheint.

Es gibt alternativ auch irgendeine Bibliothekt zum einbinden, welche diese Popups für die benötigte Zeit deaktivieren und danach wieder aktivieren kann welche Security Manager 2007 for Microsoft® Outlook® heißt.

Lg XXX

1
3 Beiträge seit 2008
vor 15 Jahren

Hallo Peter File,

Ich habe grade ein ähnliches Szenario mit Redemption implementiert. (Redemption).

Damit kann man die Sicherheitsabfrage via extended MAPI elegant umgehen. Du musst aber dafür auf dem client Redemption installieren (= die dll registrieren) und sie ist kostenpflichtig für kommerzielle Applikationen (150 USD oder so).

Dafür läufts ohne workarounds wie Fenster wegklicken o.ä.

Beispiele in meinem Beitrag:
Antworten auf Outlook Meetingrequests automatisch im gemeinsamen Kalender updaten

P
Peter File Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

Hallo Danke für die Antworten, aber habe gemerkt, dass ich mich nicht genau genug ausgedrückt habe.

Was ich eigentlich brauche, ist die Möglichkeit auf den Button/Combobox/Checkbox per hwnd zuzugreifen. Wie bekomme ich den hwnd für diese steuerelemente, mit findwindow klappt es nur für das Parentfenster (Die Sicherheitsabfrage an sich, nicht die Steuerelemente)

Oder geht das nicht??

Ich habs bisher nur hinbekommen einen Tastendruck (enter) per Postmessage an das Fenster zu schicken.

ExpressClickyes oder Redemption will ich nicht benutzen, da das ganze ein Plugin für Mediaportal (Opensource) werden soll.
Link

915 Beiträge seit 2006
vor 15 Jahren

Hallo Peter,

[Erste Lösung, die einfachste]
nutze **FindWindowEx **und du kannst auch die Childfenster (Controls) Handels ausfindig machen.
Für das Wegklicken schicke WM_CLICK= 0x00F5 an den Button "Yes" selbst. mit PostMessage (nicht SendMessage). Über den C++ code unten kannst auch nach den Buttonnamen dann suchen.

[Zweite Lösung, die schönere und wiederverwendbare]
Du könntest auch Subclassing verwenden, siehe hierzu dr4g0n76 Artikel, der machts dir schon recht einfach, mit System.Windows.Forms.NativeWindow AssignHandle(hWnd) kannst das SubClassing vereinfachen. Dann kannst sogar mit WM_CREATE über lParam die jeweiligen Childbuttons lokalisieren und über ihren Text Identifizieren (wie in der ersten Lösung).

C++ (ist ja fix in C# umgesetzt)


td::string GetWindowText( HWND wnd )
{
   std::string text;
WPARAM length = SendMessage( wnd, WM_GETTEXTLENGTH, 0,
0, 0 );
   if( length > 0 )
   {
      char *buffy = new char [length+1];
 
LRESULT got = SendMessage( wnd, WM_GETTEXT,
TTEXT, length+1, (LPARAM)buffy );
      if( (LRESULT)length == got )
         text = buffy;
 
      delete [] buffy;
   }
   return text;
}

Jetzt wüsstest du die Buttons (suchst halt nach English udn Deutscher Sprachausgabe) und setzt evtl. von aussen welcher MessageBox Button weggeklickt werden soll. Somit hast dein eigenes Tool dafür geschrieben .-)

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

P
Peter File Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

Cool danke! Das klingt ziemlich genau nach dem was ich brauche.. wenns nicht klappt meld ich mich 🙂

915 Beiträge seit 2006
vor 15 Jahren

Hatte nen Tipfehler drinnen, bei der zweiten Lösung: Dort kannst über WM_CREATE nicht über SetWindowex den Button lokalisieren sondern über lParam. Hatte nur grade was mit SetWinowEx gearbeitet.. irgendwie Freudscher versprecher 🙂

Habs im Post korrigiert.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

P
Peter File Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

Hallo,

habe wieder ein paar Stunden herumprobiert:
Mit FindWindowEx habe ich das hwnd des Buttons erhalten, aber
mit Post/Sendmessage (VK_Enter, Space, Return, Click usw) konnte ich diesen "Ja" Button einfach nicht drücken.
Von Subclassing habe ich leider noch keine Ahnung, aber es läuft jetzt recht gut damit:

Fenster in Vordergrund holen und:

// ALT+Z Checkbox
        keybd_event(VK_KEY_Z, MapVirtualKey(VK_KEY_Z, 0), 0, 0);
        keybd_event(VK_LMENU, MapVirtualKey(VK_LMENU, 0), 0, 0);
        keybd_event(VK_KEY_Z, MapVirtualKey(VK_KEY_Z, 0), KEYEVENTF_KEYUP, 0);
        keybd_event(VK_LMENU, MapVirtualKey(VK_LMENU, 0), KEYEVENTF_KEYUP, 0);
       //usw.

Kümmer mich gerade um das Automatische Reagieren auf die Abfrage sobald sie erscheint. Gibt es da ne Möglichkeit die Existenz des Fensters festzustellen? Ist halt kein eigener Prozess...

Ansonsten schau ich gerade, ob es reicht, wenn ich beim Outlook Zugriff festelle, ob die Abfrage gerade "da" ist.

915 Beiträge seit 2006
vor 15 Jahren

Hrm, es gibt verschiedene Wege die existenz eines Fensters herauszufinden. Klar mit FindWindowEx bekommst als returnwert den Pointer. Wenn dieser wiederum = Inptr.Zero ist (0) so weist das das Fenster nicht vorhanden ist.

Der Ansatz um z.B. festzstellen ob das Fenster aufplopt wäre über WMI. Du könntest zuerst im WMI dir über dne Scope ein Event feuern lassen wenn das Programm dass das Fenster beinhaltet gestartet wird. Und dann mal schauen ob es eine WMI Nachricht gibt auf die du dann ein Event für WM_CREATE findest. Wenn es keine WMI dafür gibt hast du ja durch die erste WMI Abfrage herausgefunden dass Programm gestartet ist und könntest nun über das MainWindowHandle das über de ermittelden Prozess herausfindest mit SubClassing versehen. Das geht sehr eifnach mit NativeWindow und der Funktion Assert(hwnd). Hier bekämst du alle WindowsNachrichten herein und könntest nun auf WM_CREATE immer schauen ob das Fenster das gerade in diesen Prozess erstellt wird, dein gesuchtes fenster ist und weiter wie gehabt vorgehen. Du kannst auch versuchen über C++ z.B. einen Klassischen Hook zu schreiben fals NativeWindow aus irgendwelchen Sicherheitsgründen heraus (sollte aber gehen) nicht funktioniert. Nutze dafür in C++ nicht SetWindowsHookEx für den WndProc Hook sondern so merkwürdig es klingt, SetWindowLong somit spaarst dir das unterjubeln eines Dll in einen Fremden Prozess die evtl. sogar durch Allocate Heap gelöscht wird (ach habs vergessen wie man das schreibt). Evtl, geht SetWindowLong auch in C# aber darauf verlassen würde ich mich nicht.

Hrm, aber versuchs wie gesagt mit NativeWindow, geht bestimmt.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

P
Peter File Themenstarter:in
29 Beiträge seit 2008
vor 15 Jahren

Danke nochmal! Ich habe leider bisher noch nie etwas mit WMI gemacht und deshalb in der Zwischenzeit mal mit einem einfachen Timer herumgespielt, der alle 100ms nach der Existenz des Fensters schaut.

Das ganze läuft in einem anderen hidden Konsolenprogramm und funktioniert auch erträglich.
Leider gibt es in Outlook wohl noch andere Windows mit Klassennamen "Microsoft Office Outlook", sodass bei seperat geöffnetem Outlook Fenster, das ganze durch unkoordinierte Tastendrücke nach hinten losgehen kann.
(Man nervt das hunderte leere Outlook Termine zu löschen...)

Ich könnte jetzt noch den Text des Labels vergleichen aber hmm... Gibt noch andere Sprachen als Deutsch...

Langer Rede kurzer Sinn. Ich hab mir mal den WMI Code Creator geladen.
Jedoch komm ich mit dem Programm nicht weiter, da ich keine Ahnung habe welcher Namespace da gemeint ist bei Receive Events usw...

Wie log ich das Event vom Outlookstart/Popupfenster?