CreateProcessWithLogonW

25/05/2009 - 09:16 von Jörg Schneider | Report spam
Moin!

Ich würde gerne aus unserer APP beim start ein Setup anwerfen.
Das ist ja prinzipiell auch kein Problem und funktioniert.
Hat allerdings der User keine Rechte um ein Setup auszuführen,
dann bringt das ja nichts. Un die meisten unserer User
haben keine entsprechenden Berechtigungen ;)

Also haben wir uns gedacht, bauen wir die Möglichkeit ein einen
"Admin" User konfigurieren zu können, mit welchem dann das Setup
ausgeführt wird. (Quasi RunAs ;) )

Mit dem API Call CreateProcessWithLogonW() sollte das ja gehen.
Nach einigem "gebastele" gibt mir die Funktion nun auch ne 1 zurück,
aber es wird keine EXE gestartet!?

Hat jemand von Euch so das schon mal gemacht? Wo liegt mein Denkfehler?

Hier mal der TestQuellCode:

Die Testexe die gestartet wird ist
ne FOXPRO ExE, mit der ich in ne Textdatei ne Testausgabe mache.

#define LOGON_WITH_PROFILE 0x1
#define LOGON_NETCREDENTIALS_ONLY 0x2
#define CREATE_DEFAULT_ERROR_MODE 0x4000000
#define CREATE_NEW_CONSOLE 0x10
#define CREATE_NEW_PROCESS_GROUP 0x200
#define CREATE_SEPARATE_WOW_VDM 0x800
#define CREATE_SUSPENDED 0x4
#define CREATE_UNICODE_ENVIRONMENT 0x400
#define ABOVE_NORMAL_PRIORITY_CLASS 0x8000
#define BELOW_NORMAL_PRIORITY_CLASS 0x4000
#define HIGH_PRIORITY_CLASS 0x80
#define IDLE_PRIORITY_CLASS 0x40
#define NORMAL_PRIORITY_CLASS 0x20
#define REALTIME_PRIORITY_CLASS 0x100

declare integer GetLastError in kernel32
DECLARE INTEGER CreateProcessWithLogonW IN Advapi32;
STRING lpUsername, STRING lpDomain, STRING lpPassword, INTEGER dwLogonFlags,;
STRING lpAppName, STRING lpCmdLine, ;
INTEGER dwCreationFlags,;
INTEGER lpEnvir,;
STRING lpCurDir,;
STRING @ lpStartupInfo, STRING @ lpProcessInfo

Declare integer CloseHandle in kernel32.dll integer hToken


cUser = "User"
cDomain = "Domain"
cPass = "Kennwort"
cAppName = ""
cCommandLine= "C:\testuserexe.exe"+chr(0)
cDir = ""
cStartInfo = GetStartupInfo()
pProc = REPLICATE(CHR(0), 16)
lnPrio = 32

lx = CreateProcessWithLogonW( cUser, cDomain, cPass, LOGON_NETCREDENTIALS_ONLY, ;
cAppName, cCommandLine , 0 , 0 , cDir, @cStartInfo, @pProc)

?lx

if lx = 0
? getLastError()
else
hProcess = buf2dword(substr(pProc, 1,4))
hThread = buf2dword(substr(pProc, 5,4))
CloseHandle(hThread)
CloseHandle(hProcess)
endif


PROCEDURE getStartupInfo
* creates the STARTUP structure to specify main window
* properties if a new window is created for a new process

*| typedef struct _STARTUPINFO {
*| DWORD cb; 4
*| LPTSTR lpReserved; 4
*| LPTSTR lpDesktop; 4
*| LPTSTR lpTitle; 4
*| DWORD dwX; 4
*| DWORD dwY; 4
*| DWORD dwXSize; 4
*| DWORD dwYSize; 4
*| DWORD dwXCountChars; 4
*| DWORD dwYCountChars; 4
*| DWORD dwFillAttribute; 4
*| DWORD dwFlags; 4
*| WORD wShowWindow; 2
*| WORD cbReserved2; 2
*| LPBYTE lpReserved2; 4
*| HANDLE hStdInput; 4
*| HANDLE hStdOutput; 4
*| HANDLE hStdError; 4
*| } STARTUPINFO, *LPSTARTUPINFO; total: 68 bytes

#DEFINE STARTF_USESHOWWINDOW 1
#DEFINE SW_SHOWMAXIMIZED 3

RETURN num2dword(68) +;
num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(0) + num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(STARTF_USESHOWWINDOW) +;
num2word(SW_SHOWMAXIMIZED) +;
num2word(0) + num2dword(0) +;
num2dword(0) + num2dword(0) + num2dword(0)

* * *
* dword is compatible with LONG
FUNCTION num2dword (lnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = Int(lnValue/m2)
b2 = Int((lnValue - b3*m2)/m1)
b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
* * *
* dword is compatible with LONG
FUNCTION num2word (lnValue)
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
* * *
FUNCTION buf2word (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256
* * *
FUNCTION buf2dword (lcBuffer)
RETURN;
Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(lcBuffer, 4,1)) * 16777216
ENDFUNC

FUNCTION long2str
********************
* Passed : 32-bit non-negative numeric value (m.longval)
* Returns : ASCII character representation of passed
* value in low-high format (m.retstr)
* Example :
* m.long = 999999
* m.longstr = long2str(m.long)
PARAMETERS m.longval
PRIVATE i, m.retstr
m.retstr = ""
FOR i = 24 TO 0 STEP -8
m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr
m.longval = MOD(m.longval, (2^i))
NEXT
RETURN m.retstr
endfunc
 

Lesen sie die antworten

#1 Stefan Wuebbe
25/05/2009 - 12:24 | Warnen spam
cUser = "User"
cDomain = "Domain"
cPass = "Kennwort"



Ich denk eventuell fehlen Chr(0) Bytes am Ende deiner Parameter, Christian Ehlscheid hat
mal darüber geschrieben:
http://groups.google.com/groups/sea...sitesearch
Als Alternative würde ich viellecht Heise/c't MachMichAdmin.cmd ausprobieren:
http://www.heise.de/ct/05/26/links/222.shtml
weil es in der Lage ist, dem aktuellen "eingeschrànkten" Benutzer vorübergehend höhere
Rechte zu geben, sodass eventuelle Account-bezogene Dateien und Registry Eintràge im
richtigen "Documents and Settings" Ordner und HKCU Zweig landen.


hth
-Stefan


"Jörg Schneider" wrote in message
news:
Moin!

Ich würde gerne aus unserer APP beim start ein Setup anwerfen. Das ist ja prinzipiell
auch kein Problem und funktioniert.
Hat allerdings der User keine Rechte um ein Setup auszuführen,
dann bringt das ja nichts. Un die meisten unserer User haben keine entsprechenden
Berechtigungen ;)

Also haben wir uns gedacht, bauen wir die Möglichkeit ein einen "Admin" User
konfigurieren zu können, mit welchem dann das Setup ausgeführt wird. (Quasi RunAs ;) )

Mit dem API Call CreateProcessWithLogonW() sollte das ja gehen. Nach einigem "gebastele"
gibt mir die Funktion nun auch ne 1 zurück, aber es wird keine EXE gestartet!?
Hat jemand von Euch so das schon mal gemacht? Wo liegt mein Denkfehler?

Hier mal der TestQuellCode:

Die Testexe die gestartet wird ist ne FOXPRO ExE, mit der ich in ne Textdatei ne
Testausgabe mache.

#define LOGON_WITH_PROFILE 0x1
#define LOGON_NETCREDENTIALS_ONLY 0x2
#define CREATE_DEFAULT_ERROR_MODE 0x4000000
#define CREATE_NEW_CONSOLE 0x10
#define CREATE_NEW_PROCESS_GROUP 0x200
#define CREATE_SEPARATE_WOW_VDM 0x800
#define CREATE_SUSPENDED 0x4
#define CREATE_UNICODE_ENVIRONMENT 0x400
#define ABOVE_NORMAL_PRIORITY_CLASS 0x8000
#define BELOW_NORMAL_PRIORITY_CLASS 0x4000
#define HIGH_PRIORITY_CLASS 0x80
#define IDLE_PRIORITY_CLASS 0x40
#define NORMAL_PRIORITY_CLASS 0x20
#define REALTIME_PRIORITY_CLASS 0x100

declare integer GetLastError in kernel32
DECLARE INTEGER CreateProcessWithLogonW IN Advapi32;
STRING lpUsername, STRING lpDomain, STRING lpPassword, INTEGER
dwLogonFlags,;
STRING lpAppName, STRING lpCmdLine, ;
INTEGER dwCreationFlags,;
INTEGER lpEnvir,;
STRING lpCurDir,;
STRING @ lpStartupInfo, STRING @ lpProcessInfo

Declare integer CloseHandle in kernel32.dll integer hToken


cUser = "User"
cDomain = "Domain"
cPass = "Kennwort"
cAppName = ""
cCommandLine= "C:\testuserexe.exe"+chr(0)
cDir = ""
cStartInfo = GetStartupInfo()
pProc = REPLICATE(CHR(0), 16)
lnPrio = 32

lx = CreateProcessWithLogonW( cUser, cDomain, cPass, LOGON_NETCREDENTIALS_ONLY, ;
cAppName, cCommandLine , 0 , 0 , cDir, @cStartInfo, @pProc)

?lx

if lx = 0
? getLastError()
else
hProcess = buf2dword(substr(pProc, 1,4))
hThread = buf2dword(substr(pProc, 5,4))
CloseHandle(hThread)
CloseHandle(hProcess)
endif


PROCEDURE getStartupInfo
* creates the STARTUP structure to specify main window
* properties if a new window is created for a new process

*| typedef struct _STARTUPINFO {
*| DWORD cb; 4
*| LPTSTR lpReserved; 4
*| LPTSTR lpDesktop; 4
*| LPTSTR lpTitle; 4
*| DWORD dwX; 4
*| DWORD dwY; 4
*| DWORD dwXSize; 4
*| DWORD dwYSize; 4
*| DWORD dwXCountChars; 4
*| DWORD dwYCountChars; 4
*| DWORD dwFillAttribute; 4
*| DWORD dwFlags; 4
*| WORD wShowWindow; 2
*| WORD cbReserved2; 2
*| LPBYTE lpReserved2; 4
*| HANDLE hStdInput; 4
*| HANDLE hStdOutput; 4
*| HANDLE hStdError; 4
*| } STARTUPINFO, *LPSTARTUPINFO; total: 68 bytes

#DEFINE STARTF_USESHOWWINDOW 1
#DEFINE SW_SHOWMAXIMIZED 3

RETURN num2dword(68) +;
num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(0) + num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(0) + num2dword(0) + num2dword(0) +;
num2dword(STARTF_USESHOWWINDOW) +;
num2word(SW_SHOWMAXIMIZED) +;
num2word(0) + num2dword(0) +;
num2dword(0) + num2dword(0) + num2dword(0)

* * *
* dword is compatible with LONG
FUNCTION num2dword (lnValue)
#DEFINE m0 256
#DEFINE m1 65536
#DEFINE m2 16777216
LOCAL b0, b1, b2, b3
b3 = Int(lnValue/m2)
b2 = Int((lnValue - b3*m2)/m1)
b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
* * *
* dword is compatible with LONG
FUNCTION num2word (lnValue)
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
* * *
FUNCTION buf2word (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256
* * *
FUNCTION buf2dword (lcBuffer)
RETURN;
Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(lcBuffer, 4,1)) * 16777216
ENDFUNC

FUNCTION long2str
********************
* Passed : 32-bit non-negative numeric value (m.longval)
* Returns : ASCII character representation of passed
* value in low-high format (m.retstr)
* Example :
* m.long = 999999
* m.longstr = long2str(m.long)
PARAMETERS m.longval
PRIVATE i, m.retstr
m.retstr = ""
FOR i = 24 TO 0 STEP -8
m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr
m.longval = MOD(m.longval, (2^i))
NEXT
RETURN m.retstr
endfunc





|\_/| ProLib - programmers liberty --
(.. ) Our MVPs and MCPs make the Fox run
- / See us at www.prolib.de or www.AFPages.de

Ähnliche fragen