Einzelnen Beitrag anzeigen

hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#1

JEDI API für Delphi XE2

  Alt 15. Sep 2011, 09:03
Guten Morgen

ich habe soeben Delphi XE2 gekauft weil ich schon seit langem einen Dienst, der mit einem Treiber kommuniziert, auch in einer 64-Bit-Version haben sollte. Nach einigen Mühen habe ich sogar geschafft, auch die JEDI-JCL/JVCL-Komponenten zu installieren.
Nun stehe ich aber mit dem JEDI-API (aktuelle Version von SourceForgeNet) an. Ich bekomme beim Compile zuerst eine Fehlermeldung
JwsclLsa.pas(111): E2010 Inkompatible Typen: 'Cardinal' und 'NativeUInt'
(Zeile 111, property LsaHandle: Cardinal Read fLsaHandle; )

Wenn ich hingehe und einfach mal probehalber das 'Cardinal' in 'Handle' ändere, läuft mir Kompilation weiter bis zum Fehler
JwsclLsa.pas(481): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Auch da wieder führt ein probehalbes Ändern von hToken: TJwTokenHandle; zu hToken : Handle; scheinbar zu Erfolg. Doch dann steht die Umwandlung auf JwslToken.pas an, vermutlich als Folgefehler meiner 'Anpassungen' in JwsclLsa.pas. Der Fehler ist dann folgender:
JwsclToken.pas(3195): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Derselbe Fehler wiederholt sich auf Zeilen 3256, 3298, 3452, 3454, 3461, 3501, 3502, 3509, 3628, 3691 und 3735.

Da habe ich dann meine Versuche abgebrochen.

Nun meine Fragen:
- hat es jemand gescchafft, die JEDI-API auf Delphi-XE2 zu installieren?
- wenn nein, weiss jemand, wann man mit einer kompatiblen Version rechnen kann?
- Gibt es etwas anderes 'gescheites' um aus einem Service eine Desktop-Applikation als System-User zu pushen, so dass diese auf jeden möglichen Desktop angezeigt wird. Falls das jemand interessiert, hier die Funktion, welche auf W-XP oder W-7 auf 32-Bit-Maschinen perfekt funktioniert.

Besten Dank für Eure Antworten

Code:
{Starter of Notify program}
procedure TAMNotifier1.StartApp(const App, Parameters, CurDir : TJwString);
var
   pi             : PROCESS_INFORMATION;
   si             : STARTUPINFO;
   dwSessionId    : DWORD;
   winlogonPid    : DWORD;
   hUserToken     : THANDLE;
   hUserTokenDup  : THANDLE;
   hPToken        : THANDLE;
   hProcess       : THANDLE;
   hsnap          : THANDLE;
   dwCreationFlags : DWORD;
   procEntry      : TPROCESSENTRY32;
   winlogonSessId : DWORD;
   tp             : TOKEN_PRIVILEGES;
   lpenv          : pointer;
   err            : boolean;
   pCurDir        : TJwPChar;
   pCmdLine       : TJwPChar;
begin
  pCmdLine        := TJwPChar('"'+App+'" ' + Parameters);
  pCurDir         := Nil;
  if Length(CurDir) > 0 then
     pCurDir := TJwPChar(CurDir);
  dwSessionId := WTSGetActiveConsoleSessionId();
  hSnap      := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnap = INVALID_HANDLE_VALUE) then
      exit;
  procEntry.dwSize := sizeof(TPROCESSENTRY32);
  repeat
     if (comparetext(procEntry.szExeFile, 'winlogon.exe') = 0) then
        begin
        winlogonSessId := 0;
        if (ProcessIdToSessionId(procEntry.th32ProcessID, winlogonSessId)
           and (winlogonSessId = dwSessionId)) then
           begin
           winlogonPid := procEntry.th32ProcessID;
           break;
           end;
        end;
  until (not Process32Next(hSnap, procEntry));
  WTSQueryUserToken(dwSessionId, hUserToken);
  dwCreationFlags := NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE;
  ZeroMemory(@si, sizeof(STARTUPINFO));
  si.cb       := sizeof(STARTUPINFO);
  si.lpDesktop := 'winsta0\Winlogon';
  ZeroMemory(@pi, sizeof(pi));
  hProcess    := OpenProcess(MAXIMUM_ALLOWED,FALSE,winlogonPid);
  if(not OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY
     or TOKEN_DUPLICATE or TOKEN_ASSIGN_PRIMARY or TOKEN_ADJUST_SESSIONID
     or TOKEN_READ or TOKEN_WRITE, hPToken)) then
     Err := True;
  if (not LookupPrivilegeValue(nil,SE_DEBUG_NAME,tp.Privileges[0].Luid)) then
     Err := True;
  tp.PrivilegeCount := 1;
  tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  DuplicateTokenEx(hPToken,MAXIMUM_ALLOWED,Nil,
           SecurityIdentification,TokenPrimary,hUserTokenDup);
  SetTokenInformation(hUserTokenDup,
          TokenSessionId,pointer(dwSessionId),sizeof(DWORD));
  if (not AdjustTokenPrivileges(hUserTokenDup,FALSE,@tp,sizeof(TOKEN_PRIVILEGES),
          nil,nil)) then
     Err := True;
  if (GetLastError() = ERROR_NOT_ALL_ASSIGNED) then
     Err := True;
  lpEnv := nil;
  if(CreateEnvironmentBlock(lpEnv,hUserTokenDup,TRUE)) then
     dwCreationFlags := dwCreationFlags or CREATE_UNICODE_ENVIRONMENT
  else
    lpEnv := nil;
  CreateProcessAsUser(hUserTokenDup,TJwPChar(App), pCmdLine,
      nil, nil, FALSE, dwCreationFlags, lpEnv, pCurDir, si, pi );
  CloseHandle(hProcess);
  CloseHandle(hUserToken);
  CloseHandle(hUserTokenDup);
  CloseHandle(hPToken);
end;
Heinz Schneider
  Mit Zitat antworten Zitat