Seite 1 von 1

Rechte des angemeldeter Users auslesen

Verfasst: 30.06.2017 11:01
von TheCube
Hallo !
Es gibt hier einen (vielen bekannten) Sourcecode, mit dem man den gerade im Windows angemeldeten Benutzer auslesen kann.

Code: Alles auswählen

; coded by jpd, july 2012
EnableExplicit

#WTS_CURRENT_SERVER_HANDLE = 0
#WTS_CURRENT_SESSION = -1

Enumeration ;WTS_INFO_CLASS
  #WTSInitialProgram=0
  #WTSApplicationName
  #WTSWorkingDirectory
  #WTSOEMId
  #WTSSessionId
  #WTSUserName
  #WTSWinStationName
  #WTSDomainName
  #WTSConnectState
  #WTSClientBuildNumber
  #wtsclientname
  #WTSClientDirectory
  #WTSClientProductId
  #WTSClientHardwareId
  #WTSClientAddress
  #WTSClientDisplay
  #WTSClientProtocolType
EndEnumeration

Prototype WTSQuerySessionInformation(hServer.l,SessionId.l,WtsInfoClass.l,ppBuffer.l,pBytesReturned.l)
Global  WTSQuerySessionInformation.WTSQuerySessionInformation
Prototype WTSFreeMemory(lpBuffer.l)
Global  WTSFreeMemory.WTSFreeMemory

Procedure LoadWTSAPI()
  Protected Result
 
  Result = OpenLibrary(#PB_Any, "wtsapi32.dll")
  If Result
   
    WTSFreeMemory=GetFunction(Result, "WTSFreeMemory")
    CompilerIf #PB_Compiler_Unicode
      WTSQuerySessionInformation = GetFunction(Result, "WTSQuerySessionInformationW")
    CompilerElse
      WTSQuerySessionInformation = GetFunction(Result, "WTSQuerySessionInformationA")
    CompilerEndIf
   
    If WTSQuerySessionInformation = 0
      CloseLibrary(Result)
      Result = 0
    EndIf     
  EndIf
 
  ProcedureReturn Result
 
EndProcedure


Procedure.s CurrentSessionUserName(domain.b=#False)
 
  Protected pBytesReturnedaddress.l
  Protected UnameLength
  Protected Username.s
  Protected DomainName.s
  Protected libWTS
  Protected *username, *domainname
  Protected WTSQuery
  libWTS=LoadWTSAPI()
  If libWTS
   
    *username=AllocateMemory(256)
   
    WTSQuery= WTSQuerySessionInformation(#WTS_CURRENT_SERVER_HANDLE,#WTS_CURRENT_SESSION , #WTSUserName ,@*Username, @pBytesReturnedaddress)
    UnameLength=MemoryStringLength(*Username)
    Username=PeekS(*Username,UnameLength)
    WTSFreeMemory(*Username)
    If domain
      *domainname=AllocateMemory(256)
      WTSQuery= WTSQuerySessionInformation(#WTS_CURRENT_SERVER_HANDLE,#WTS_CURRENT_SESSION , #WTSDomainName,@*domainname, @pBytesReturnedaddress)
      UnameLength=MemoryStringLength(*domainname)
      DomainName=PeekS(*domainname,UnameLength)
      WTSFreeMemory(*domainname)
    EndIf
   
    CloseLibrary(libWTS)
  EndIf
 
  If Len(DomainName) > 0 And domain = #True
    ProcedureReturn DomainName+"\"+Username
  Else
    ProcedureReturn Username
  EndIf
 
EndProcedure

Debug CurrentSessionUserName()
Oder man benutzt Debug GetEnvironmentVariable("USERNAME"), das funktioniert wohl (meist) auch ...

Aber wie kann ich die Rechte des Users feststellen, um z.B. einem Admin spezielle Buttons in meinem Programm einzublenden,
oder dem einfachen User eine abgespeckte GUI zu präsentieren ?
In der WinAPI-Library habe ich natürlich schon gesucht aber wurde leider nicht fündig.

Re: Rechte des angemeldeter Users auslesen

Verfasst: 30.06.2017 16:22
von NicknameFJ
Hi TheCube,

ich prüfe Admins immer mit

Code: Alles auswählen

if IsUserAnAdmin_()
  ; mache etwas was nur Admins dürfen
endif
Grüße

NicknameFJ

Re: Rechte des angemeldeter Users auslesen

Verfasst: 01.07.2017 02:50
von TheCube
Danke, so einfach kann es manchmal sein. :)
Man muss aber in den Compileroptions "Request Admin-Mode" aktivieren (?)
Sonst ist man laut IsUserAnAdmin_() auch als Admin (der bin ich hier) nur ein User.

Code: Alles auswählen

; Set compiler options : Request Administrator mode

If IsUserAnAdmin_()
  Debug "User ist Admin"
Else
    Debug "Nur User"
EndIf
Vielleicht hat ja mal jemand über den SECURITY_DESCRIPTOR oder AccessCheck_()
(oder was die MSDN sonst noch hergibt) etwas gezaubert .....

Re: Rechte des angemeldeter Users auslesen

Verfasst: 02.07.2017 19:06
von NicknameFJ
Hallo TheCube,

ich konnte bisher bei mir noch keine Probleme feststellen.

Wenn ich als Admin angemeldet bin dann hat bei mir IsUserAnAdmin() dies IMMER richtig erkannt.

WIN 7 X64

NicknameFJ

Re: Rechte des angemeldeter Users auslesen

Verfasst: 02.07.2017 19:40
von TheCube
Dann bleibts wohl erstmal mysteriös ...
nutze Win7 x32 , PB5.60 und habs mal EXE-Tauglich gemacht.

Code: Alles auswählen

; Set compiler options : Request Administrator mode (nötig ?)

If IsUserAnAdmin_()
  MessageRequester("Information", "Angemeldet: Administrator", #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
Else
  MessageRequester("Information", "Angemeldet: User", #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
EndIf
Aber ich bleibe der Funktion IsUserAnAdmin_() zufolge ohne "Request Admin mode" nur User,
auch wenn meine Benutzerkontensteuerung was anderes sagt. :shock:

Grüsse.

Re: Rechte des angemeldeter Users auslesen

Verfasst: 02.07.2017 20:22
von ts-soft
Das hängt mit UAC zusammen. Du bist nur User, solange keine Rechte angefordert werden.

Re: Rechte des angemeldeter Users auslesen

Verfasst: 04.07.2017 00:11
von TheCube
Wie so oft bei ts-soft: Kurz und richtig. :allright:

Hatte UAC bisher immerhin auf eine Stufe über aus. Dann ist man für Funktion IsUserAnAdmin_()
immer nur User, wenn man ohne 'Request Administrator mode' compiliert.

Schaltet man UAC aus (Slider ganz unten) funktioniert es korrekt.
Von UAC komplett deaktiviert kann man aber auf fremden PCs nicht ausgehen,
somit ist IsUserAnAdmin_() eigentlich eher schlecht einzusetzen ....