如何以代码判断是否以管理员身份运行?

时间:2021-02-06 14:46:58
自己用VC12写的窗体程序。

如何在自己写的程序的代码里实现:

1.一般运行:
   在文件管理器中,选择自己程序生成的exe。点击右键,选择"打开"。
   程序自己判断"以管理员身份运行"为否。

2.以管理员运行
   在文件管理器中,选择自己程序生成的exe。点击右键,选择"以管理员身份运行"。
    程序自己判断"以管理员身份运行"为是。

请问如何以VC代码实现。

10 个解决方案

#1


属性--连接器--清单文件-》UAC执行级别-》requireAdministrator (/level='requireAdministrator')

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentityversion="1.0.0.0" processorArchitecture="X86" name="VistaLogoDemo" type="win32"/>
  <description>Description of your application</description>
  <!-- Identify the application security requirements.-->
  <trustInfoxmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
  <requestedPrivileges>
  <requestedExecutionLevellevel="requireAdministrator" uiAccess="false"/>
  </requestedPrivileges>
  </security>
  </trustInfo>
 </assembly>

#2


获取当前用户,获取当前用户组,判断当前用户组是否是管理员组

#3


http://blog.csdn.net/fengrx/article/details/4212144

#4


引用 3 楼 oyljerry 的回复:
http://blog.csdn.net/fengrx/article/details/4212144


这个文章里面的程序总是返回TRUE,即管理员权限。

但不是我要达到的目的。

我的是Win7 64位系统,以管理员账户登录。
我猜想文章中是返回是否以管理员登录。

而我要的是是否以管理员权限运行。

即使以管理员账户登录,“一般运行”后程序仍是具有非管理员权限,此时不能写入注册表。
“以管理员运行”后程序即具有管理员权限,可以写入注册表。

#5


引用 4 楼 bebeing 的回复:
Quote: 引用 3 楼 oyljerry 的回复:

http://blog.csdn.net/fengrx/article/details/4212144


这个文章里面的程序总是返回TRUE,即管理员权限。

但不是我要达到的目的。

我的是Win7 64位系统,以管理员账户登录。
我猜想文章中是返回是否以管理员登录。

而我要的是是否以管理员权限运行。

即使以管理员账户登录,“一般运行”后程序仍是具有非管理员权限,此时不能写入注册表。
“以管理员运行”后程序即具有管理员权限,可以写入注册表。

这个就是程序自己判断它是否为管理员权限

#6


即使以管理员账户登录,“一般运行”后程序仍是具有非管理员权限,此时不能写入注册表。

你不是正好可以利用这一点来判断?  当然, 这是取巧.

http://blog.csdn.net/Just_Fancy/article/details/6310347这里说得貌似靠谱.

#7



SC_HANDLE schSCManager = OpenSCManager(
NULL, 
NULL, 
SC_MANAGER_CREATE_SERVICE
); 

if (schSCManager == NULL) 
{
//非管理员
}

#8


昨天刚剽窃的: 如何以代码判断是否以管理员身份运行?
#pragma comment(lib,"advapi32")
#include <windows.h>
#include <stdio.h>
BOOL IsAdmin(void) {
    HANDLE                   hAccessToken;
    BYTE                     *InfoBuffer=NULL;
    PTOKEN_GROUPS            ptgGroups;
    DWORD                    dwInfoBufferSize;
    PSID                     psidAdministrators;
    SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
    UINT                     i;
    BOOL                     bRet = FALSE;

    if (!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken)) goto cleanup;
    InfoBuffer = new BYTE[1024];
    if (!InfoBuffer) goto cleanup;
    bRet = GetTokenInformation(hAccessToken,
                               TokenGroups,
                               InfoBuffer,
                               1024,
                               &dwInfoBufferSize);
    CloseHandle( hAccessToken );
    if (!bRet) goto cleanup;
    if (!AllocateAndInitializeSid(&siaNtAuthority,
                                 2,
                                 SECURITY_BUILTIN_DOMAIN_RID,
                                 DOMAIN_ALIAS_RID_ADMINS,
                                 0,0,0,0,0,0,
                                 &psidAdministrators))
       goto cleanup;
    bRet = FALSE;
    ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
    for (i=0;i<ptgGroups->GroupCount;i++) {
        if (EqualSid(psidAdministrators,ptgGroups->Groups[i].Sid)) {
            bRet = TRUE;
            break;//
        }
    }
    FreeSid(psidAdministrators);
cleanup:
    if (InfoBuffer) delete InfoBuffer;
    return bRet;
}
int main() {
   if (IsAdmin()) {printf("IsAdmin - TRUE\n");return 0;}
   else           {printf("IsAdmin - FALSE\n");return 1;}
}

#9


核心编程上有一段代码判断是否以未筛选的Token的管理员权限运行。

#10


MSDN上获取当前运行的进程是否具有管理员权限

BOOL IsUserAdmin()
/*++
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token.
Arguments: None.
Return Value:
TRUE - Caller has Administrators local group.
FALSE - Caller does not have Administrators local group. --
*/
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(&NtAuthority,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0, 0, 0, 0, 0, 0,&AdministratorsGroup);
if (b)
{
if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
{
b = FALSE;
}
FreeSid(AdministratorsGroup);
}

return(b);
}

#1


属性--连接器--清单文件-》UAC执行级别-》requireAdministrator (/level='requireAdministrator')

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentityversion="1.0.0.0" processorArchitecture="X86" name="VistaLogoDemo" type="win32"/>
  <description>Description of your application</description>
  <!-- Identify the application security requirements.-->
  <trustInfoxmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
  <requestedPrivileges>
  <requestedExecutionLevellevel="requireAdministrator" uiAccess="false"/>
  </requestedPrivileges>
  </security>
  </trustInfo>
 </assembly>

#2


获取当前用户,获取当前用户组,判断当前用户组是否是管理员组

#3


http://blog.csdn.net/fengrx/article/details/4212144

#4


引用 3 楼 oyljerry 的回复:
http://blog.csdn.net/fengrx/article/details/4212144


这个文章里面的程序总是返回TRUE,即管理员权限。

但不是我要达到的目的。

我的是Win7 64位系统,以管理员账户登录。
我猜想文章中是返回是否以管理员登录。

而我要的是是否以管理员权限运行。

即使以管理员账户登录,“一般运行”后程序仍是具有非管理员权限,此时不能写入注册表。
“以管理员运行”后程序即具有管理员权限,可以写入注册表。

#5


引用 4 楼 bebeing 的回复:
Quote: 引用 3 楼 oyljerry 的回复:

http://blog.csdn.net/fengrx/article/details/4212144


这个文章里面的程序总是返回TRUE,即管理员权限。

但不是我要达到的目的。

我的是Win7 64位系统,以管理员账户登录。
我猜想文章中是返回是否以管理员登录。

而我要的是是否以管理员权限运行。

即使以管理员账户登录,“一般运行”后程序仍是具有非管理员权限,此时不能写入注册表。
“以管理员运行”后程序即具有管理员权限,可以写入注册表。

这个就是程序自己判断它是否为管理员权限

#6


即使以管理员账户登录,“一般运行”后程序仍是具有非管理员权限,此时不能写入注册表。

你不是正好可以利用这一点来判断?  当然, 这是取巧.

http://blog.csdn.net/Just_Fancy/article/details/6310347这里说得貌似靠谱.

#7



SC_HANDLE schSCManager = OpenSCManager(
NULL, 
NULL, 
SC_MANAGER_CREATE_SERVICE
); 

if (schSCManager == NULL) 
{
//非管理员
}

#8


昨天刚剽窃的: 如何以代码判断是否以管理员身份运行?
#pragma comment(lib,"advapi32")
#include <windows.h>
#include <stdio.h>
BOOL IsAdmin(void) {
    HANDLE                   hAccessToken;
    BYTE                     *InfoBuffer=NULL;
    PTOKEN_GROUPS            ptgGroups;
    DWORD                    dwInfoBufferSize;
    PSID                     psidAdministrators;
    SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
    UINT                     i;
    BOOL                     bRet = FALSE;

    if (!OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&hAccessToken)) goto cleanup;
    InfoBuffer = new BYTE[1024];
    if (!InfoBuffer) goto cleanup;
    bRet = GetTokenInformation(hAccessToken,
                               TokenGroups,
                               InfoBuffer,
                               1024,
                               &dwInfoBufferSize);
    CloseHandle( hAccessToken );
    if (!bRet) goto cleanup;
    if (!AllocateAndInitializeSid(&siaNtAuthority,
                                 2,
                                 SECURITY_BUILTIN_DOMAIN_RID,
                                 DOMAIN_ALIAS_RID_ADMINS,
                                 0,0,0,0,0,0,
                                 &psidAdministrators))
       goto cleanup;
    bRet = FALSE;
    ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
    for (i=0;i<ptgGroups->GroupCount;i++) {
        if (EqualSid(psidAdministrators,ptgGroups->Groups[i].Sid)) {
            bRet = TRUE;
            break;//
        }
    }
    FreeSid(psidAdministrators);
cleanup:
    if (InfoBuffer) delete InfoBuffer;
    return bRet;
}
int main() {
   if (IsAdmin()) {printf("IsAdmin - TRUE\n");return 0;}
   else           {printf("IsAdmin - FALSE\n");return 1;}
}

#9


核心编程上有一段代码判断是否以未筛选的Token的管理员权限运行。

#10


MSDN上获取当前运行的进程是否具有管理员权限

BOOL IsUserAdmin()
/*++
Routine Description: This routine returns TRUE if the caller's
process is a member of the Administrators local group. Caller is NOT
expected to be impersonating anyone and is expected to be able to
open its own process and process token.
Arguments: None.
Return Value:
TRUE - Caller has Administrators local group.
FALSE - Caller does not have Administrators local group. --
*/
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
b = AllocateAndInitializeSid(&NtAuthority,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0, 0, 0, 0, 0, 0,&AdministratorsGroup);
if (b)
{
if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
{
b = FALSE;
}
FreeSid(AdministratorsGroup);
}

return(b);
}