Rechte des angemeldeter Users auslesen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
TheCube
Beiträge: 150
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Rechte des angemeldeter Users auslesen

Beitrag 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.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Rechte des angemeldeter Users auslesen

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
TheCube
Beiträge: 150
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Rechte des angemeldeter Users auslesen

Beitrag 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 .....
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Rechte des angemeldeter Users auslesen

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
TheCube
Beiträge: 150
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Rechte des angemeldeter Users auslesen

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Rechte des angemeldeter Users auslesen

Beitrag von ts-soft »

Das hängt mit UAC zusammen. Du bist nur User, solange keine Rechte angefordert werden.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
TheCube
Beiträge: 150
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Rechte des angemeldeter Users auslesen

Beitrag 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 ....
Antworten