From 19dc003fcc433ff04531521f10a01ac6be24a423 Mon Sep 17 00:00:00 2001 From: cxl Date: Thu, 23 Oct 2014 05:52:35 +0000 Subject: [PATCH] .uppdev git-svn-id: svn://ultimatepp.org/upp/trunk@7814 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppdev/Win32Admin/Win32Admin.upp | 9 ++++++ uppdev/Win32Admin/main.cpp | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 uppdev/Win32Admin/Win32Admin.upp create mode 100644 uppdev/Win32Admin/main.cpp diff --git a/uppdev/Win32Admin/Win32Admin.upp b/uppdev/Win32Admin/Win32Admin.upp new file mode 100644 index 000000000..78afc12a4 --- /dev/null +++ b/uppdev/Win32Admin/Win32Admin.upp @@ -0,0 +1,9 @@ +uses + CtrlLib; + +file + main.cpp; + +mainconfig + "" = "GUI SSE2"; + diff --git a/uppdev/Win32Admin/main.cpp b/uppdev/Win32Admin/main.cpp new file mode 100644 index 000000000..9ee23b588 --- /dev/null +++ b/uppdev/Win32Admin/main.cpp @@ -0,0 +1,52 @@ +#include + +#include + +using namespace Upp; + +bool IsAdmin() +{ + SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; + PSID AdministratorsGroup; + // Initialize SID. + if( !AllocateAndInitializeSid( &NtAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &AdministratorsGroup)) + { + // Initializing SID Failed. + return false; + } + // Check whether the token is present in admin group. + BOOL IsInAdminGroup = FALSE; + if( !CheckTokenMembership( NULL, + AdministratorsGroup, + &IsInAdminGroup )) + { + // Error occurred. + IsInAdminGroup = FALSE; + } + // Free SID and return. + FreeSid(AdministratorsGroup); + + return IsInAdminGroup; +} + +GUI_APP_MAIN +{ + if(IsAdmin()) { + RLOG("Now I am admin, everything is fine."); + PromptOK("I am an admin!"); + } + else { + RLOG("Not an admin, starting as admin"); + PromptOK("Not an admin, running as admin"); + ShellExecute(NULL, "runas", GetExeFilePath(), 0, 0, SW_SHOWNORMAL); + return; + } + + RLOG("Doing admin stuff..."); + getchar(); +}