Ich sah IsInRole-Methode, aber ich kann keine Informationen finden, wie Sie es mit C++ verwenden.Wie überprüfe ich, ob mein Programm von Benutzer als Administrator (Vista/Win7, C++) ausgeführt wird
Q
Wie überprüfe ich, ob mein Programm von Benutzer als Administrator (Vista/Win7, C++) ausgeführt wird
6
A
Antwort
2
Es gibt ein C++ - Code-Snippet in this old answer aus dem Projekt UACHelpers auf CodePlex.
-1
Sie könnten dieses Stück Code versuchen. Es gibt eine Skizze von dem, was getan werden muss:
const HANDLE hProcess = GetCurrentProcess();
if (hProcess==NULL)
return FAILURE;
HANDLE hToken;
const BOOL lR = OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
if (lR == NULL)
return FAILURE;
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY x = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(
&x, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
&psidAdministrators))
return FAILURE;
bool isAdmin = false; //dummy init
DWORD size;
GetTokenInformation(hToken, TokenGroups, NULL, 0, &size);
char* buffer = new char[size];
DWORD notUsed;
if (!GetTokenInformation(hToken, TokenGroups, (void*)buffer, size, ¬Used))
return FAILURE;
TOKEN_GROUPS* ptgGroups = (TOKEN_GROUPS*)buffer;
isAdmin = false; //until proven otherwise
for (UINT32 i=0; i<ptgGroups->GroupCount; ++i)
{
if (EqualSid(psidAdministrators, ptgGroups->Groups[i].Sid))
{
isAdmin = true;
break;
}
}
FreeSid(psidAdministrators);
return isAdmin;
1
Die Dokumentation von IsUSerAnAdmin
erklärt, dass es seit Vista veraltet ist, sondern verweist Sie auf CheckTokenMembership
. Das sollte die Arbeit für dich erledigen.
2
Dieser Code löst Ihr Problem. Fühlen Sie sich frei, es zu benutzen. Es funktioniert mit SE_GROUP_USE_FOR_DENY_ONLY.
/**
IsGroupMember determines if the current thread or process has a token that contais a given and enabled user group.
Parameters
dwRelativeID: Defines a relative ID (par of a SID) of a user group (e.g. Administrators DOMAIN_ALIAS_RID_ADMINS (544) = S-1-5-32-544)
bProcessRelative: Defines whether to use the process token (TRUE) instead of the thread token (FALSE). If FALSE and no thread token is present
the process token will be used though.
bIsMember: Returns the result of the function. The value returns TRUE if the user is an enabled member of the group; otherwise FALSE.
Return Value
If the function succeeds, the return value is TRUE; otherwise FALSE. Call GetLastError for more information.
*/
BOOL IsGroupMember(DWORD dwRelativeID, BOOL bProcessRelative, BOOL* pIsMember)
{
HANDLE hToken, hDupToken;
PSID pSid = NULL;
SID_IDENTIFIER_AUTHORITY SidAuthority = SECURITY_NT_AUTHORITY;
if (!pIsMember)
{
SetLastError(ERROR_INVALID_USER_BUFFER);
return FALSE;
}
if (bProcessRelative || !OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken))
{
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hToken))
{
return FALSE;
}
}
if (!DuplicateToken(hToken, SecurityIdentification, &hDupToken))
{
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
hToken = hDupToken;
if (!AllocateAndInitializeSid(&SidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, dwRelativeID, 0, 0, 0, 0, 0, 0,
&pSid))
{
CloseHandle(hToken);
return FALSE;
}
if (!CheckTokenMembership(hToken, pSid, pIsMember))
{
CloseHandle(hToken);
FreeSid(pSid);
*pIsMember = FALSE;
return FALSE;
}
CloseHandle(hToken);
FreeSid(pSid);
return TRUE;
}
BOOL IsUserAdministrator(BOOL* pIsAdmin)
{
return IsGroupMember(DOMAIN_ALIAS_RID_ADMINS, FALSE, pIsAdmin);
}
Verwandte Themen
- 1. Wie erzwinge ich, dass mein C# Winforms-Programm als Administrator auf einem beliebigen Computer ausgeführt wird?
- 2. Wie kann ich feststellen, ob mein Prozess als Administrator ausgeführt wird?
- 3. Wie überprüfe ich, ob ein Programm als aktueller Benutzer über bat oder cmd läuft?
- 4. C | Wie überprüfe ich, ob mein Eingabepuffer (Stdin) leer ist?
- 5. Starten Sie einen Prozess als Benutzer aus einem Prozess, der als Administrator ausgeführt wird
- 6. Wie überprüfe ich, ob Code aus einem Nasentest ausgeführt wird?
- 7. Windows VB.NET Application Exe als Administrator ausgeführt
- 8. Wie kann ich feststellen, ob mein Prozess interaktiv ausgeführt wird?
- 9. Ermitteln, ob das Programm mit vollen Administratorrechten ausgeführt wird
- 10. Wie erzwinge ich, dass mein Projekt in Visual Studio 2013 immer als Administrator ausgeführt wird?
- 11. C# Prüfen Sie, ob als Administrator ausführen
- 12. C/C++ Ermitteln, ob ein Programm ausgeführt wird
- 13. Wie kann ich erkennen, ob mein Programm in einer Active Directory-Umgebung ausgeführt wird?
- 14. Wie überprüfe ich, ob mein Programm Daten in es piped hat
- 15. Programm muss als Administrator in Windows 10 ausgeführt werden
- 16. Wie programmgesteuert "Dieses Programm als Administrator ausführen"
- 17. Wie kann ich erkennen, ob mein Prozess UAC-erhöht ausgeführt wird oder nicht?
- 18. Wie überprüfe/bestätige ich, ob GPS vom Benutzer eingeschaltet wurde?
- 19. Als Administrator ausführen, Wie überprüfe ich, ob ein Windows-Konto Berechtigungen zum Lesen eines Verzeichnisses hat?
- 20. Überprüfen, ob ein Programm ausgeführt wird
- 21. Wie überprüfe ich, ob der Benutzer eine Taste drückt?
- 22. C#: Überprüfen Sie, ob Administrator Schreibzugriff auf eine Datei hat
- 23. Wie überprüfe ich, ob mein Python alle benötigten Pakete hat?
- 24. Wie erzwinge ich, dass meine F # -Anwendung als Administrator ausgeführt wird?
- 25. Wie erkennt man, ob mein Programm in Windows läuft?
- 26. Wie überprüfe ich, ob mein Array ein Objekt enthält?
- 27. Wie überprüfe ich, ob mein ISP Port 25 blockiert?
- 28. Ermitteln Sie, ob ein Programm auf einem Remotedesktop ausgeführt wird
- 29. Wie überprüfe ich, ob der Benutzer in Javascript eingeloggt ist
- 30. Wie kann ich feststellen, auf welchem Monitor mein .NET Windows Forms-Programm ausgeführt wird?
Dieser Code ist die NT4-Methode, mit der überprüft werden kann, ob eine SID Teil eines Benutzer-Tokens ist. Bei neueren Systemen funktioniert sie nicht korrekt und sollte nicht verwendet werden. Siehe Rup SO-Link für meine Antwort und welche Funktion zu rufen ... – Anders
@Anders: Es funktioniert sicher unter Windows XP, Windows Vista und Windows 7. Dieser Code wurde auf diesen drei Systemen ziemlich ausführlich getestet. Warum denkst du, es würde nicht funktionieren? –
Ich weiß, es ist kaputt, also haben Sie einfach nicht richtig getestet. Es gibt eine Sache, die SID nur verweigern genannt wird, und Ihr aktueller Code behandelt diese nicht, Sie sollten CheckTokenMembership verwenden. – Anders