Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Start MsgBox in User Session

Frage Entwicklung Batch & Shell

Mitglied: Uragus

Uragus (Level 1) - Jetzt verbinden

23.10.2014, aktualisiert 11:24 Uhr, 1330 Aufrufe, 5 Kommentare, 1 Danke

Hallo,
Ich habe eine BAT Datei die mit Hilfe von VBS eine MsgBox aufruft.
Die BAT wird in Session 0 ausgeführt, somit sieht der User die MsgBox nicht.
Kann mir jemand helfen die Msf für den User sichtbar zu machen?

01.
@echo off 
02.
 
03.
call :MsgBox "KAV Installieren?"  "VBYesNo+VBQuestion" "KAV" 
04.
if errorlevel 7 ( 
05.
        echo NO 
06.
) else if errorlevel 6 ( 
07.
        echo YES 
08.
        start "" "Setup.exe" 
09.
10.
 
11.
exit /b 
12.
 
13.
:MsgBox prompt type title 
14.
    setlocal enableextensions 
15.
    set "tempFile=%temp%\%~nx0.%random%%random%%random%vbs.tmp" 
16.
    >"%tempFile%" echo(WScript.Quit msgBox("%~1",%~2,"%~3") & cscript //nologo //e:vbscript "%tempFile%" 
17.
    set "exitCode=%errorlevel%" & del "%tempFile%" >nul 2>nul 
18.
    endlocal & exit /b %exitCode%
Mitglied: DerWoWusste
23.10.2014 um 10:45 Uhr
Hi.

Fernab von vbs: Wenn Du als Admin oder Systemkonto
msg * Nachricht
aufrufst, geht das an alle Sessions.
Bitte warten ..
Mitglied: Friemler
LÖSUNG 23.10.2014, aktualisiert um 11:24 Uhr
Hallo Uragus,

seit Windows Vista können Prozesse, die in Session 0 laufen, nicht mehr über die MessageBox-API mit der User-Session komunizieren. Es gibt dafür jedoch den speziellen Win32-API-Aufruf WTSSendMessage, den Du allerdings aus einem VBScript heraus nicht ansprechen kannst. Einzige Möglichkeit wäre demnach, ein kleines Programm (z.B. in C oder C++) zu schreiben, das WTSSendMessage benutzt, um die per Parameter übergebene Message anzuzeigen. Dieses Programm kannst Du aus Deinem Batchscript heraus starten.

Ein MSDN-Artikel, der sich mit der Problematik beschäftigt, findet sich hier.

Evtl. findet sich ja auch per Google ein fertiges Tool, was genau das benötigte macht. Das Problem hatten bestimmt schon andere vor Dir.

Gruß
Friemler


[EDIT]
Aha, DerWoWusste macht seinem Namen wieder mal alle Ehre.
[/EDIT]
Bitte warten ..
Mitglied: Uragus
23.10.2014 um 11:26 Uhr
Danke für die Aufklärung.
Bitte warten ..
Mitglied: Friemler
LÖSUNG 24.10.2014, aktualisiert 08.11.2014
Ich habe dann doch noch das Hilfsprogramm zum Anzeigen von Messageboxen aus Session 0 heraus geschrieben. Ich habe es mit der Open Source IDE CodeBlocks in C für MinGW entwickelt.

Fertig compilierte Binaries von MinGW findet man hier.

User rubberman hat außerdem hier eine sehr schöne Anleitung veröffentlicht, um die CodeBlocks IDE incl. MinGW mit Hilfe eines von ihm entwickelten VBScripts als portable Version zu betreiben.

Für den folgenden Code eine Datei namens main.c anlegen und ihn dort hinein kopieren. Aber ACHTUNG!! Die Datei bitte in der Codierung UTF-8 mit BOM (Byte Order Mark) abspeichern!
01.
#define _WIN32_WINNT 0x0600   // Minimale Windowsversion setzen 
02.
#include <sdkddkver.h>        // Andere Versions-Defines setzen lassen 
03.
 
04.
#define WIN32_LEAN_AND_MEAN   // Anzahl der einzubindenden Windowsheader reduzieren 
05.
#define STRICT 1              // Strikte Typkompatibilität in den Windowsheadern aktivieren 
06.
 
07.
#define UNICODE               // Unicode in den 
08.
#define _UNICODE              // Headerfiles aktivieren 
09.
#include <wchar.h>            // Unicode Stringfunktionen einbinden 
10.
 
11.
#include <stddef.h>           // Standardheader einbinden 
12.
#include <stdlib.h> 
13.
 
14.
#include <windows.h>          // Windowsheader einbinden 
15.
#include <wtsapi32.h> 
16.
 
17.
 
18.
 
19.
 
20.
/* ******************* */ 
21.
/* Function prototypes */ 
22.
/* ******************* */ 
23.
INT  wmain(INT argc, WCHAR *argv[]); 
24.
BOOL parseCmdLine(INT argc, WCHAR *argv[], LPWSTR *message, LPWSTR *title, DWORD *buttons, WINBOOL *waitForClick, DWORD *timeout); 
25.
 
26.
 
27.
 
28.
 
29.
/* ************ */ 
30.
/* Main program */ 
31.
/* ************ */ 
32.
INT wmain(INT argc, WCHAR *argv[]) 
33.
34.
  WCHAR   exeName[_MAX_FNAME+1] = L""; 
35.
  LPWSTR  title                 = L""; 
36.
  LPWSTR  message               = NULL; 
37.
  DWORD   buttons               = MB_ICONINFORMATION | MB_OK; 
38.
  DWORD   titleLength           = 0; 
39.
  DWORD   messageLength         = 0; 
40.
  DWORD   timeout               = 0; 
41.
  WINBOOL waitForClick          = FALSE; 
42.
  DWORD   response              = -1; 
43.
 
44.
  DWORD   physConSession = WTSGetActiveConsoleSessionId(); 
45.
 
46.
  if (physConSession != 0xFFFFFFFF) 
47.
48.
    if (parseCmdLine(argc, argv, &message, &title, &buttons, &waitForClick, &timeout)) 
49.
50.
      // Die Stringlängen müssen auch bei Unicode-Strings 
51.
      // in Bytes angegeben werden! 
52.
      messageLength = wcslen(message) * sizeof(*message); 
53.
      titleLength   = wcslen(title)   * sizeof(*title); 
54.
 
55.
      WTSSendMessage(WTS_CURRENT_SERVER_HANDLE, 
56.
                     physConSession, 
57.
                     title, titleLength, 
58.
                     message, messageLength, 
59.
                     buttons, 
60.
                     timeout, 
61.
                     &response, 
62.
                     waitForClick); 
63.
64.
    else 
65.
66.
      _wsplitpath(argv[0], NULL, NULL, exeName, NULL); 
67.
 
68.
      _cwprintf(L"%ls \"Nachricht\" [-h:\"Titel\"] [-b:Buttons] [t:Wartezeit] [/w:true]\n" \ 
69.
                L"\n" \ 
70.
                L"Nachricht  Text der anzuzeigenden Nachricht.\n" \ 
71.
                L"Titel      Text, der in der Titelzeile der Message Box angezeigt wird.\n" \ 
72.
                L"Buttons    Eine Zahl, in der der Typ des anzuzeigenden Icons, die darzustellen-\n" \ 
73.
                L"           den Buttons und die Nummer des Default-Buttons codiert wird. Die\n" \ 
74.
                L"           möglichen Werte finden sich in der Dokumentation der MessageBox-\n" \ 
75.
                L"           Funktion auf MSDN.\n" \ 
76.
                L"Wartezeit  Wartezeit in Sekunden, nach der sich die Message Box von selbst\n" \ 
77.
                L"           schliesst. Ein Wert von 0 führt dazu, dass der Benutzer zuerst auf\n" \ 
78.
                L"           einen der Buttons klicken muss, bis die Box geschlossen wird.\n" \ 
79.
                L"/w:true    Wird dieser Parameter angegeben, wird erst nachdem die Message Box\n" \ 
80.
                L"           geschlossen wurde, die Kontrolle an den Aufrufer zurück gegeben.\n" \ 
81.
                L"\n" \ 
82.
                L"Das Programm setzt den ERRORLEVEL entsprechend dem Rückgabewert der Message\n" \ 
83.
                L"Box. Die möglichen Werte und ihre Bedeutung findet man ebenfalls in der\n" \ 
84.
                L"Dokumentation der MessageBox-Funktion auf MSDN."\ 
85.
                L"\n", 
86.
                exeName); 
87.
88.
89.
 
90.
  return response; 
91.
92.
 
93.
 
94.
 
95.
BOOL parseCmdLine(INT argc, WCHAR *argv[], LPWSTR *message, LPWSTR *title, DWORD *buttons, WINBOOL *waitForClick, DWORD *timeout) 
96.
97.
  INT   cnt; 
98.
  WCHAR paramName[4]; 
99.
 
100.
  for (cnt = 1; cnt < argc; cnt++) 
101.
102.
    wcsncpy(paramName, argv[cnt], 3); 
103.
    paramName[3] = 0; 
104.
 
105.
    if      (wcsnicmp(paramName, L"/h:", 3) == 0) 
106.
      *title = &argv[cnt][3]; 
107.
 
108.
    else if (wcsnicmp(paramName, L"/w:", 3) == 0) 
109.
      *waitForClick = wcsnicmp(&argv[cnt][3], L"true", 4) == 0 ? TRUE : FALSE; 
110.
 
111.
    else if (wcsnicmp(paramName, L"/t:", 3) == 0) 
112.
      *timeout = wcstoul(&argv[cnt][3], NULL, wcsnicmp(&argv[cnt][3], L"0x", 2) == 0 ? 16 : 10); 
113.
 
114.
    else if (wcsnicmp(paramName, L"/b:", 3) == 0) 
115.
      *buttons = wcstoul(&argv[cnt][3], NULL, wcsnicmp(&argv[cnt][3], L"0x", 2) == 0 ? 16 : 10); 
116.
 
117.
    else 
118.
      *message = argv[cnt]; 
119.
120.
 
121.
  return(*message != NULL); 
122.
}
Im gleichen Verzeichnis dann eine Batchdatei namens build.cmd anlegen und folgenden Code hineinkopieren:
01.
@echo off & setlocal 
02.
 
03.
set "PrjName=ServiceMessage" 
04.
set "SourceFile=main" 
05.
 
06.
set "PrjPath=%~dp0" 
07.
set "GCCPath=E:\CodeBlocksPortable\CodeBlocks\mingw32\bin" 
08.
 
09.
cd /d "%GCCPath%" 
10.
 
11.
gcc.exe -finput-charset=UTF-8 -g -O2 -I..\mingw\include -c "%PrjPath%\%SourceFile%.c" -o "%PrjPath%\%SourceFile%.o" 
12.
g++.exe -L..\mingw\lib -o "%PrjPath%\%PrjName%.exe" "%PrjPath%\%SourceFile%.o" -s -municode -static-libgcc -lkernel32 -lwtsapi32
In Zeile 7 muss man den Pfad zu dem Verzeichnis eintragen, in dem die gcc.exe gespeichert ist. Durch Start der Batchdatei wird der obige C-Quelltext übersetzt. Die erstellte EXE-Datei wird im gleichen Verzeichnis wie die build.cmd abgelegt.

Gruß
Friemler


[EDIT]
Der Quellcode und das Build-Script erzeugen jetzt ein Unicode-fähiges Programm.
[/EDIT]
Bitte warten ..
Mitglied: Uragus
24.10.2014 um 12:44 Uhr
besten Dank
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows Server
User-ID zu Application Crash

Frage von pablovic zum Thema Windows Server ...

Router & Routing
Radius für 15 User direkt über Mikrotik- oder Ubiquiti-Router (4)

Frage von Muesliriegel zum Thema Router & Routing ...

Windows 8
gelöst Active Directory Default User.v2 Profile - Windows 8.1 Apps Error (4)

Frage von adm2015 zum Thema Windows 8 ...

Windows 7
gelöst Automatische User Abmeldung nach Inaktivität (30s) (10)

Frage von IT-Blondi zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...