Announcement

Collapse
No announcement yet.

getUserName oder ähnliches aus Service

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Meinst Du jetzt auch aus einem Service heraus?
    Da bekomme ich noch immer nur "SYSTEM" zurück, das habe ich aber nicht weiter verfolgt, weil ich nur wissen wollte ob jemand angemeldet ist oder nicht, was ich jetzt anders gelöst habe, Wer nun wirklich angemeldet ist weiss ich jeweils nicht... Reicht Dir die Info ob jemand angemeldet ist oder nicht auch aus

    Comment


    • #17
      Hallo Karsten,

      ja das würde mich auch sehr interessiere!

      Danke,

      Ola

      Comment


      • #18
        also, los gehts:<pre>
        unit MT_NTStatus;

        interface

        uses windows, classes, sysutils;

        type
        TDesktopSwitchThread = class(TThread)
        public
        procedure Execute; override;
        end;

        var
        desktopSwitch : TDesktopSwitchThread;
        switchCount, oldSwitchCount : Integer;
        activeScreenName : string[30];
        activeScreenH, lastScreenH : THandle;

        implementation

        uses ModsoTapiMain;

        ////////////////////////////////////////////////////////////////////////////////
        //
        // Some NT types and constants
        //
        ////////////////////////////////////////////////////////////////////////////////

        type
        NTSTATUS = Integer;

        const
        STATUS_SUCCESS = NTSTATUS(0);
        STATUS_ACCESS_DENIED = NTSTATUS($C0000022);

        type
        PUnicodeString = ^TUnicodeString;
        TUnicodeString = packed record
        Length : Word;
        MaximumLength: Word;
        Buffer : PWideChar;
        end;

        const
        OBJ_INHERIT = $00000002;
        OBJ_PERMANENT = $00000010;
        OBJ_EXCLUSIVE = $00000020;
        OBJ_CASE_INSENSITIVE = $00000040;
        OBJ_OPENIF = $00000080;
        OBJ_OPENLINK = $00000100;
        OBJ_KERNEL_HANDLE = $00000200;
        OBJ_VALID_ATTRIBUTES = $000003F2;

        type
        PObjectAttributes = ^TObjectAttributes;
        TObjectAttributes = record
        Length : LongInt;
        RootDirectory : THandle;
        ObjectName : PUnicodeString;
        Attributes : ULONG;
        SecurityDescriptor : PSecurityDescriptor;
        SecurityQualityOfService: PSecurityQualityOfService;
        end;

        ////////////////////////////////////////////////////////////////////////////////
        //
        // Object attributes for the event which is triggered on desktop switch
        //
        ////////////////////////////////////////////////////////////////////////////////

        const
        DesktopSwitchEventNameString = '\BaseNamedObjects\WinSta0_DesktopSwitch';
        DesktopSwitchEventName: TUnicodeString = (
        Length : Length(DesktopSwitchEventNameString) * SizeOf(WideChar);
        MaximumLength: Length(DesktopSwitchEventNameString) * SizeOf(WideChar) + SizeOf(WideChar);
        Buffer : DesktopSwitchEventNameString;
        );

        const
        DesktopSwitchEventAccessMask: ACCESS_MASK = SYNCHRONIZE;

        const
        DesktopSwitchEventAttributes: TObjectAttributes = (
        Length : SizeOf(TObjectAttributes);
        RootDirectory : 0;
        ObjectName : @DesktopSwitchEventName;
        Attributes : OBJ_CASE_INSENSITIVE;
        SecurityDescriptor : nil;
        SecurityQualityOfService: nil; );

        ////////////////////////////////////////////////////////////////////////////////
        //
        // Nt/ZwOpenEvent
        //
        ////////////////////////////////////////////////////////////////////////////////

        const
        ntdll = 'ntdll.dll';

        function NtOpenEvent(out EventHandle: THandle; DesiredAccess: ACCESS_MASK; const ObjectAttributes: TObjectAttributes): NTSTATUS; stdcall;
        external ntdll name 'NtOpenEvent';
        function ZwOpenEvent(out EventHandle: THandle; DesiredAccess: ACCESS_MASK; const ObjectAttributes: TObjectAttributes): NTSTATUS; stdcall;
        external ntdll name 'ZwOpenEvent';

        ////////////////////////////////////////////////////////////////////////////////
        //
        // Utility function for translating NTSTATUS to Win32 error-code
        //
        ////////////////////////////////////////////////////////////////////////////////

        function RtlNtStatusToDosError(Status: NTSTATUS): DWORD; stdcall;
        external ntdll name 'RtlNtStatusToDosError';
        </pre&gt

        Comment


        • #19
          und weiter:<pre>
          Procedure TDesktopSwitchThread.execute;
          var
          Status: NTSTATUS;
          EventHandle: THandle;
          l : Cardinal;
          begin
          activeScreenH := OpenInputDesktop(0,true,DESKTOP_ENUMERATE);
          if activeScreenH = 0 then debugP('Kein Desktop?!');
          while not Terminated do begin
          Sleep(100);
          Status := ZwOpenEvent(EventHandle, DesktopSwitchEventAccessMask, DesktopSwitchEventAttributes);
          if (Status >= 0) then // negativ bedeutet fehlgeschlagen...
          try
          WaitForSingleObject(EventHandle, INFINITE);
          sleep(500);
          activeScreenH := OpenInputDesktop(0,true,DESKTOP_ENUMERATE);
          if activeScreenH = 0 then debugP('Kein Desktop?!')
          else begin
          l := sizeof(activeScreenName)-1;
          if GetUserObjectInformation(activeScreenH,UOI_NAME,@a ctiveScreenName[1],l,l) then begin
          setlength(activeScreenName,l-1);
          end else debugP('neuer Desktop: no name?!');
          end;
          inc(switchCount);
          finally
          CloseHandle(EventHandle);
          end
          else
          debugP('Error: ' + SysErrorMessage(RtlNtStatusToDosError(Status)));
          end;
          end;

          end.
          </pre>
          jetzt reicht im Create des Services der Aufruf<pre>
          desktopSwitch := TDesktopSwitchThread.Create(false);
          </pre>und dann in einem Timer-Ereignis:
          <pre>
          if switchCount <> oldSwitchCount then begin
          oldSwitchCount := switchCount;
          if activeScreenName = 'Default' then
          ....
          else if activeScreenName = 'Screen-saver' then
          ....
          else debugPrint(activeScreenName);
          </pre>
          oder so ähnlich ;

          Comment


          • #20
            Hallo Karsten,

            danke dir!

            Gruss

            Ola

            Comment

            Working...
            X