Externes Programm starten
-
Setzt mal vor dem einbinden von windows.h noch das ein:
#define _WIN32_WINNT 0x0500
-
nunja ein widestring ist hier einfach nur ein multibyte character string... also unicode... da das eine unicode funktion ist (erkennbar an der W-endung der funktion) muss man seine strings mit dem makro _T() konviertieren...
Soo ich hab mich dann mal erbarmt und ein bischen code getippt... bei mir klappt das so und das notepad startet auch ordnungsgemäß als user testaccount. viel spaß damit...
/* Einbinden der Advapi32.lib nicht vergessen!!! */ #define _WIN32_WINNT 0x0500 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.cb = sizeof(si); WCHAR szCommandLine[] = _T("notepad.exe"); // Darf nicht const sein!!! if(!CreateProcessWithLogonW(_T("testaccount"), _T("."), _T("hallo"), LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi)) // Der Punkt beim Parameter 2 bedeutet, das die lokale Benutzerdatenbank verwendet werden soll. { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONEXCLAMATION); LocalFree(lpMsgBuf); // Bei Fehlermeldung: "Der angegebene Dienst kann nicht gestartet werden..." // überprüfe ob der Dienst "Sekundäre Anmeldung" aktiviert und gestartet ist! } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }
Gruß
PS: Bitte den Hinweis mit dem "Sekundäre Anmeldung" beachten...
-
Also vielen vielen Dank,
soll Dir im Kindersegen wieder rein kommen.
Das werde ich dann gleich mal testen.
Gruß
andy_mann
-
Hallo,
ich habe mich ja schon gefreut, dass ich was habe...
aber Fehler:
error C2440: 'initializing' : 'char [12]' kann nicht in 'unsigned short []' konvertiert werden
Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
error C2065: 'CreateProcessWithLogonW' : nichtdeklarierter Bezeichner
error C2065: 'LOGON_WITH_PROFILE' : nichtdeklarierter Bezeichnerhabe auch
/* Einbinden der Advapi32.lib nicht vergessen!!! */
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <tchar.h>eingebunden.
Braucht man wirklich das update, was Hepi geschrieben hat ??
Das sin 200 MB aus dem Netz
Gruß andy_mann
-
andy_mann schrieb:
Braucht man wirklich das update, was Hepi geschrieben hat ??
jep, wär net schlecht
-
andy_mann schrieb:
Braucht man wirklich das update, was Hepi geschrieben hat ??
Das sin 200 MB aus dem Netz
Kommt ganz drauf an, was für eine Version Du momentan hast.
Hast Du nie ein Platform SDK gezogen und installiert und benutzt VC 6, dann ist Dein SDK auf dem Stand von Win98 (geschätzt)...
Da es aber Deine gewünschte Funktion erst ab Windows 2000/XP/Server 2003 gibt, kennt evtl. Dein PSDK diese Funktion gar nicht...
Du brauchst also ein PSDK, welches für die entwicklung von Software für Win2000/XP gedacht ist.
Es sind knapp 340 MB zum saugen. Evtl. kennst Du wen mit DSL/Flatrate/Brenner, der könnte dir das herunterladen und auf CD brennen...
-
ahja,
das könnte natürlich ein grund sein.
Werde ich mal machen. Und anschließend mal neu testen.
Vielen Dank noch für die Links...
Gruß
andy_mann
-
Hallo Leute,
habe mir jetzt die 340 MB gesaugt entpackt und anschließend Installiert.
Bei der Installation gabe es keine Fehler.
Dennoch wird die Funktion "CreateProcessWithLogonW" nicht erkannt.
Muß man die SDA eventuell noch gesondert einbinden ??
Noch zu Installation.
Ich habe vor längerem schon die MDAC 2.8 drauf geschmissen.
SDK will ja 2,7 installieren.
Habe alles was zum installieren angklickt und installiert.
Keine Fehlermeldung.Bis auf dass er mir die zu installierende
Core SDK
Core SDK (Windows Server 2003) ist installiertund dann die
Microsoft Data Access Components (Version 2.7)
WMI SDK
Tablet PC SDK
Windows Media Services SDK
Internet Development SDK (Version 6.0)
Internet Information Server SDK (Version 5.1)
Windows Installer SDK (Version 2.0)
zum anklicken anzeigt, ich dieses auch mache, anschließen aber nicht als installiert gekennzeichnet ist.Kanns daran liegen ??
Gruß
andy_mann
-
Du müßtest jetzt noch in Deiner IDE (was benutzt Du? VC6?) dafür sorgen, das die Ordner des PSDK an oberster Stelle stehen (quasi als erstes eingelesen werden).
-
Ich benütze VS 6.0
wahrscheinlich demnächst .net
wie mache ich das mit der Einstellung ??
Gruß
andy_mann
-
Extras --> Optionen --> Verzeichnisse
"Include" und "Bibliothekdateien", da sollten die Ordner vom PSDK ganz oben in der Liste stehen...
-
MMmmmmm ich schon wieder....
habe jetzt verschiedene Verzeichnisse ausprobiert.
Keine Besserung.Habe die CAB Files heruntergeladen,
diese in ein Verzeichniss geteckt c:\temp\sdk
dort entpackt nach c:\psdktemp
dann verschoben nach c:\install\sdk
dort habe ich setup aufgerufen, was mir obiges resultat gebracht hat.
anschließend stand unter c:\programme\microsoft sdk\.....welches Verzeichnis jetzt genau ??
Ich krige es nicht hin.....
Gruß
andy_mann
-
Include Dateien:
C:\Programme\Microsoft SDK\includeBibliothekdateien:
C:\Programme\Microsoft SDK\lib
-
hmmmm..
jetzt gibt es noch mehr fehler....
und
CreateProcessWithLogonW
ist immernoch dabei...error C2061: Syntaxfehler : Bezeichner 'DWORD_PTR'
error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Key'
error C2501: 'ULONG_PTR' : Fehlende Speicherklasse oder Typbezeichner
error C2501: 'Key' : Fehlende Speicherklasse oder Typbezeichner
error C2061: Syntaxfehler : Bezeichner 'DWORD_PTR'
error C2440: 'initializing' : 'char [12]' kann nicht in 'unsigned short []' konvertiert werden
Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
error C2065: 'CreateProcessWithLogonW' : nichtdeklarierter Bezeichner
error C2065: 'LOGON_WITH_PROFILE' : nichtdeklarierter BezeichnerMuß ich es so langsam auf geben ;-((
Gruß
andy_mann
-
Kannst Du mal deinen Code kurz posten, mit Kommentaren, die zeigen in welcher Zeile welcher Fehler kommt?
-
Also erst mal vielen Dank für dein Bemühen......
ich hoffe nicht dass ich jetzt komplett auf dem Holzweg bin, ich habe nähmlich ein Projekt im konsolenmodus und MFC unterstützung erstellt....
Trotzdem hier der Source.....
// RegeditSearch.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. // #define _WIN32_WINNT 0x0500 #include "stdafx.h" #include <windows.h> #include <tchar.h> #include "RegeditSearch.h" #include "Meldung.h" #include "Daten.h" #include <iostream> #include <string> #include "Util.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Das einzige Anwendungsobjekt CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // MFC initialisieren, Ausgabe und Fehlermeldung bei Fehlern if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // ZU ERLEDIGEN: Fehlercode gemäß Ihren Anforderungen ändern cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // ZU ERLEDIGEN: Anwendungsverhalten hier festlegen. /* CString strHello; strHello.LoadString(IDS_HELLO); cout << (const TCHAR*)strHello << endl; */ CDaten m_cDaten; std::string m_strBetreff; char buffer[20480]; char EinPfad2[500]; DWORD destSize2; destSize2=500; std::string m_strErgebnis; std::string Schluessel; std::string SchluesselPfad; std::string SchluesselPfad2; std::string SchluesselName; std::string SchluesselWert; std::string SchluesselProgramm; std::string m_strStartProgramm; GetPrivateProfileSection("Such Objekt",buffer, sizeof(buffer),m_cDaten.getIniPfad().c_str()); char *pBuffer = buffer; while(strlen(pBuffer) != 0) { // std::cout << pBuffer << std::endl; Schluessel = CUtil::WortStelleZeille(pBuffer,0,1,';'); SchluesselPfad = CUtil::WortStelleZeille(pBuffer,1,2,';'); SchluesselName = CUtil::WortStelleZeille(pBuffer,2,3,';'); SchluesselWert = CUtil::WortStelleZeille(pBuffer,3,4,';'); SchluesselProgramm = CUtil::WortStelleZeille(pBuffer,4,5,';'); SchluesselPfad2 = CUtil::PfadInProgrammPfad(SchluesselPfad); m_strErgebnis = CUtil::RegeditSearch(Schluessel, SchluesselPfad, SchluesselName); if(m_strErgebnis == "-1000") { m_strBetreff = ""; m_strBetreff = "Installation entspricht nicht der aktuellen Version\n\nUpdate wird durchgeführt.... "; // MessageBox(NULL, TEXT(m_strBetreff.c_str()), TEXT("Meldung"), 0); CMeldung *Dialog = new CMeldung(); Dialog->Create(IDD_MELDUNG, NULL); Dialog->CenterWindow(); Dialog->ShowWindow(SW_SHOW); Dialog->RedrawWindow(); Dialog->setText(m_strBetreff); Sleep(1000); Dialog->DestroyWindow(); GetPrivateProfileString("Programm Start",SchluesselProgramm.c_str(),"NULL",EinPfad2,destSize2,m_cDaten.getIniPfad().c_str()); std::string m_strEinPfad2 = EinPfad2; m_strStartProgramm = m_strEinPfad2 + " " + CUtil::KurzformSchluessel(Schluessel) + " " + SchluesselPfad + " " + SchluesselName + " 0 " + SchluesselWert; system(m_strStartProgramm.c_str()); return nRetCode; } else if(m_strErgebnis == "-2000") { // Hier komme ich hin, wenn er Durchgelaufen ist oder er nichts findet. return nRetCode; } else if(m_strErgebnis != SchluesselWert) { m_strBetreff = ""; m_strBetreff = "Installation entspricht nicht der aktuellen Version\n\nUpdate wird durchgeführt.... "; CMeldung *Dialog = new CMeldung(); Dialog->Create(IDD_MELDUNG, NULL); Dialog->CenterWindow(); Dialog->ShowWindow(SW_SHOW); Dialog->RedrawWindow(); Dialog->setText(m_strBetreff); Sleep(1000); Dialog->DestroyWindow(); GetPrivateProfileString("Programm Start",SchluesselProgramm.c_str(),"NULL",EinPfad2,destSize2,m_cDaten.getIniPfad().c_str()); std::string m_strEinPfad2 = EinPfad2; m_strStartProgramm = m_strEinPfad2 + " " + CUtil::KurzformSchluessel(Schluessel) + " " + SchluesselPfad + " " + SchluesselName + " " + m_strErgebnis + " " + SchluesselWert; // Hier rufe ich mein externes Programm auf..., aber ohne admin rechte...... // system(m_strStartProgramm.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.cb = sizeof(si); // ------ Hier kommt mein Problem....... WCHAR szCommandLine[] = _T("notepad.exe"); // Darf nicht const sein!!! if(!CreateProcessWithLogonW(_T("testaccount"), _T("."), _T("hallo"), LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi)) // Der Punkt beim Parameter 2 bedeutet, das die lokale Benutzerdatenbank verwendet werden soll. { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONEXCLAMATION); LocalFree(lpMsgBuf); // Bei Fehlermeldung: "Der angegebene Dienst kann nicht gestartet werden..." // überprüfe ob der Dienst "Sekundäre Anmeldung" aktiviert und gestartet ist! } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // ------ Hier endet mein Problem...... return nRetCode; } Schluessel= ""; SchluesselPfad = ""; SchluesselName = ""; SchluesselWert = ""; SchluesselProgramm = ""; pBuffer += strlen(pBuffer) + 1; } } return nRetCode; }
Gruß
andy_mann
-
Du hast Dein Projekt aber als UNICODE eingestellt, oder?
-
Hmmm...
bin ich mir nicht sicher,
habe einfach den Asistenten von VS 6.0 folge geleistet.
Und anschließend meinen Code hinzu gefügt.Ohne dem Markierten Beriech tut es ja.
Nur nicht mit besonderen Rechten..
GRuß
andy_mann
-
Also, ich habe es jetzt mal anders herum gemacht,
habe ein Projekt in Win32 Consolen Modus erstellt.
Habe nur den Source von vorigem Beispiel eingehängt:
/* Einbinden der Advapi32.lib nicht vergessen!!! */ #define _WIN32_WINNT 0x0500 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.cb = sizeof(si); WCHAR szCommandLine = _T("notepad.exe"); // Darf nicht const sein!!! if(!CreateProcessWithLogonW(_T("testaccount"), _T("."), _T("hallo"), LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi)) // Der Punkt beim Parameter 2 bedeutet, das die lokale Benutzerdatenbank verwendet werden soll. { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONEXCLAMATION); LocalFree(lpMsgBuf); // Bei Fehlermeldung: "Der angegebene Dienst kann nicht gestartet werden..." // überprüfe ob der Dienst "Sekundäre Anmeldung" aktiviert und gestartet ist! } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }
CreateProcessWithLogonW scheint er zu kennen, allerdings gibt es noch 2 Fehler:
error C2440: 'initializing' : 'char [12]' kann nicht in 'unsigned short' konvertiert werden
Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
D:\vcpp32\dieter\test\main.cpp(17) : error C2664: 'CreateProcessWithLogonW' : Konvertierung des Parameters 1 von 'char [12]' in 'const unsigned short *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder FunktionsformatMit der Meldung fange ich jetzt nichts an..
Kann mir jemand Helfen ??
Gruß
andy_mann
-
Wenn du einen Unicode-String brauchst kannst du einfach ein L davorsetzen - also so:
L"testaccount"