Seite 1 von 1

Erkennen, ob Programm als Admin ausgeführt wird

Verfasst: Mi, 11. Aug 2021 7:56
von Scarmo
Hallo zusammen

Gibt es eine Möglichkeit zu erkennen, ob das laufende Programm als Administrator gestartet wurde oder nicht? Es geht mir darum, dass ich aus dem Programm eine DLL-Datei mit /regserver registrieren möchte (was natürlich nur funktioniert, wenn das Programm als Administrator ausgeführt wird...).

Oder kann ich abrufen, ob eine Datei bereits mit /regserver registriert ist? Würde es allenfalls reichen, die Registry (HKLM - Software - Classes) nach der entsprechenden DLL zu durchsuchen?

Bin für jeden Input dankbar!

Gruss
Marco

Re: Erkennen, ob Programm als Admin ausgeführt wird

Verfasst: Mi, 11. Aug 2021 8:12
von Jan
Marco,

wäre da eventuell das Impersonate Asset hilfreich, das Alaska seit ein paar Monaten mit ausliefert? Ich hab mir das noch nicht näher angeschaut, weiß also nicht wie detailliert das arbeitet. Aber vielleicht kannst Du damit ja den regedit-Prozess passend anheben?

Jan

Re: Erkennen, ob Programm als Admin ausgeführt wird

Verfasst: Mi, 11. Aug 2021 8:27
von AUGE_OHR
hi,

ich nehme dazu eine "kleine" App mit einem Manifest was Admin Rechte ggf. anfordert

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="*"
     name="need Admin-rights"
     type="win32"/>
  <description>need Admin-rights</description>
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
<dependency>
    <dependentAssembly>
         <assemblyIdentity
             type="win32"
             name="Microsoft.Windows.Common-Controls"
             version="6.0.0.0"
             processorArchitecture="X86"
             publicKeyToken="6595b64144ccf1df"
             language="*"
        />
    </dependentAssembly>
</dependency>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
      <application> 
        <!--This Id value indicates the application supports Windows Vista functionality -->
          <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
        <!--This Id value indicates the application supports Windows 7 functionality-->
          <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
        <!--This Id value indicates the application supports Windows 8 functionality-->
          <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
        <!--This Id value indicates the application supports Windows 8.1 functionality-->
          <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        <!--This Id value indicates the application supports Windows 10 functionality-->
          <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> 
      </application> 
  </compatibility>
</assembly>
das ganze starte ich extern oder mit dem "RunAs" Befehl

Code: Alles auswählen

 ShellExecute( 0, "runas", cFile,,, SW_SHOW )
---

"ob" ein User Admin-Rechte hat kann man mit Ot4Xb und diesem Code von Pablo prüfen
TestRunAs.zip
(1.33 KiB) 149-mal heruntergeladen

Re: Erkennen, ob Programm als Admin ausgeführt wird

Verfasst: Mi, 11. Aug 2021 8:27
von Tom
Wie die Impersonation funktioniert, habe ich hier ausführlich erklärt: https://www.xbaseforum.de/viewtopic.php?f=24&t=11983

Mit diesem Mittel kann man das Programm mit anderen Rechten ausstatten, aber dafür muss es intern eine andere Anmeldung durchführen, also Anmeldedaten kennen. Es hat dann auch einen anderen Benutzerkontext. Natürlich kann man ein Programm dadurch zwangsweise mit Admin-Rechten ausstatten, aber das wäre ein zu großer Aufwand, nur um eine Registrierung eines Controls durchzuführen. Dafür wären entsprechende Direktiven im Manifest geeigneter. Ob ein Control bereits registriert ist, checkt man, indem man die CLSID in der Registry sucht (HKEY_CLASSES_ROOT).

Im Netz kreist der Code für einen API-Wrapper, der die Funktion "IsUseranAdmin" publiziert. Damit kann die Anwendung selbst herausbekommen, ob sie mit Admin-Rechten läuft. Die Funktion wrappt u.a. "CheckTokenMembership" aus der Windows-API. Die Funktionen dazu findet man hier: https://docs.microsoft.com/en-us/window ... membership

Re: Erkennen, ob Programm als Admin ausgeführt wird

Verfasst: Mi, 11. Aug 2021 10:14
von Scarmo
Vielen Dank für die zahlreichen Inputs. Mal schauen, ob ich über die ClsID weiterkomme.

Gruss
Marco