Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [Win2000] - Abmelden vom Dienst (https://www.delphipraxis.net/105291-%5Bwin2000%5D-abmelden-vom-dienst.html)

Dezipaitor 28. Mär 2009 12:31

Re: [Win2000] - Abmelden vom Dienst
 
Das sollte man lieber nicht so machen. Du personifizierst den aktuellen Benutzer und schaltest das Privileg aber vom Prozess.
Weiterhin kann JWSCL alles, was du da verwendet hast (mit Winapi)

Schau mal hier:
Delphi-Quellcode:
uses
  JwaWindows,
  JwsclToken,
  JwsclTypes,
  JwsclComUtils,
  JwsclVersion,
  JwsclUtils,
  JwsclPrivileges;


procedure ImpersonateAndExecute(const Flag : DWORD);
var
  Token : TJwSecurityToken;
  PrivScope : IJwPrivilegeScope;
begin
  //raises EJwsclUnsupportedWindowsVersionException
  // EJwsclPrivilegeCheckException, EJwsclWinCallFailedException
  Token := TJwSecurityToken.CreateWTSQueryUserToken(TOKEN_ALL_ACCESS);
  TJwAutoPointer.Wrap(Token);

  //raises EJwsclAccessTypeException, EJwsclSecurityException
  Token.ImpersonateLoggedOnUser;

  try
    if TJwWindowsVersion.IsWindows2000(true) then
    begin
      //raises EJwsclPrivilegeException
      PrivScope := JwGetPrivilegeScope([SE_SHUTDOWN_NAME]);

      if not ExitWindowsEx(Flag,0) then
        RaiseLastWin32Error;
    end;
  finally
    Token.RevertToSelf;
  end;
end;
Noch einfacher:
Delphi-Quellcode:
uses
  JwaWindows,
  JwsclImpersonation,
  JwsclTypes,
  JwsclComUtils,
  JwsclVersion,
  JwsclUtils,
  JwsclPrivileges,
  SysUtils;

procedure ImpersonateAndExecute(const Flag : DWORD);
var
  Imp : IJwImpersonation;
  PrivScope : IJwPrivilegeScope;
begin
  //raises EJwsclProcessIdNotAvailable
  //EJwsclWinCallFailedException
  Imp := JwImpersonateLoggedOnUser;

  if TJwWindowsVersion.IsWindows2000(true) then
  begin
    //raises EJwsclPrivilegeException
    PrivScope := JwGetPrivilegeScope([SE_SHUTDOWN_NAME]);

    if not ExitWindowsEx(Flag,0) then
      RaiseLastOSError;
  end;
end;
Beachte die Exceptions die da geworfen werden können + RaiseLastWin32Error.

Hoffe das hilft :cheers:

xZise 29. Mär 2009 15:46

Re: [Win2000] - Abmelden vom Dienst
 
Hallo Dezipaitor (diesmal kopiert ^^ ),
also ich habe vergessen zu erwähnen :oops: das wir inzwischen mit Windows XP arbeiten. Was könnte das für Änderungen im Code nach sich ziehen?

MfG
xZise

Dezipaitor 29. Mär 2009 15:57

Re: [Win2000] - Abmelden vom Dienst
 
Funktioniert nur mit dem ersten in der Konsole angemeldeten Benutzer.

xZise 29. Mär 2009 16:25

Re: [Win2000] - Abmelden vom Dienst
 
Und was heißt in diesem Kontext "im konsole angemeldeten Benutzer"?

MfG
xZise

Dezipaitor 29. Mär 2009 16:29

Re: [Win2000] - Abmelden vom Dienst
 
Das Token kommt von
demjenigen Benutzer, der sich zuerst direkt per Tastatur anmeldet. Wenn er FUS verwendet oder einfach per RDP angemeldet hat, funktioniert es so nicht.

xZise 30. Mär 2009 16:46

Re: [Win2000] - Abmelden vom Dienst
 
Hallo Dezipaitor,

Zitat:

An Exception of type EJwsclProcessIdNotAvailable was raised.
(Data was given by programmer and can vary from actual source.)
Source method....: Create
Source class.....: TJwImpersonation
Source file......: JwsclImpersonation.pas
Source line......: 0
GetLastError.....: 1400 ($578)
GetLastErrorMsg..: Ungültiges Fensterhandle

Message : The process "Progman1" (Id: 0x0) could not be found.
mit folgenden Code:
Delphi-Quellcode:
function ImpersonateAndExecute(const Flag : DWORD) : Boolean;
var
  Imp : IJwImpersonation;
  PrivScope : IJwPrivilegeScope;
begin
  Result := true;
  try
    //raises EJwsclProcessIdNotAvailable
    //EJwsclWinCallFailedException
    Imp := JwImpersonateLoggedOnUser;

    if TJwWindowsVersion.IsWindows2000(true) then
    begin
      //raises EJwsclPrivilegeException
      PrivScope := JwGetPrivilegeScope([SE_SHUTDOWN_NAME]);

      if not ExitWindowsEx(Flag, 0) then
        RaiseLastOSError;
    end else
      AddToLog('Not W2k+');
  except
    on e: Exception do
    begin
      AddToLog(e.Message);
//    on e : EJwsclProcessIdNotAvailable do
      Result := false;
//    on e : EJwsclWinCallFailedException do
      Result := false;
    end;
  end;
end;
MfG
xZise

Dezipaitor 30. Mär 2009 19:29

Re: [Win2000] - Abmelden vom Dienst
 
Du verwendest eine alte Version. Dieser Fehler wurde behoben und kann über Subversion beseitigt werden. Bitte mache ein Subversion-Update (z.b. mit TortoiseSVN)

xZise 31. Mär 2009 17:17

Re: [Win2000] - Abmelden vom Dienst
 
Okay also Herunterfahren funktioniert schonmal. Wegen den Abmelden gibt es noch das Problem, dass ich zuerst den Benutzername benötige, der aber leider noch nicht funktioniert.
Okay inzwischen tut es das, aber es gibt folgenden Fehler:
Zitat:

Systemfehler. Code: 1.
Unzulässige Funktion
MfG
xZise

xZise 1. Apr 2009 16:24

Re: [Win2000] - Abmelden vom Dienst
 
Hallo ich bin es nochmal.

Und ich wollte sagen, dass mich an dem Code wundert, das die Variable "Imp" nicht verwendet wird?

MfG
xZise

Dezipaitor 1. Apr 2009 19:24

Re: [Win2000] - Abmelden vom Dienst
 
Die wird am Ende von Delphi zerstört - Interface eben.

Ich weiß aber gerade nicht, ob die Variable überhaupt benötigt wird - kann es mir aber gut vorstellen, da das Ignorieren des Rückgabewertes die Variable zerstört (mglw.).


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz