您的位置:

Windows UAC——用户账户控制

一、概述

Windows UAC,即用户账户控制,是Windows Vista及以上版本引入的一种安全特性。它的主要目的是在用户与系统管理员之间建立一个防火墙,防止管理员不经意间的恶意或者误操作造成的灾难性后果。该技术与Unix/Linux的权限管理类似,可以限制应用程序如何影响系统,并提示用户在危险操作之前进行确认。在Windows系统中,UAC是一个与系统权限有关的难点,它不仅仅与前端的UI弹出框有关,还有与权限级别相关的API调用以及访问受限制的资源。

二、UAC的工作原理

Windows UAC的工作原理是利用互相矛盾的权限来实现,通常来说管理员会运行某些需要高权限才能运行的应用,而用户则需要一个类似管理员一样的权限才能够运行这些应用。UAC就是通过弹出请求确认的UI框和权限操作掩码等实现的。具体来说,当运行一个需要高权限的应用时,Windows就会弹出一个确认操作的UI界面,如果用户同意,那么此次操作将会获得管理员权限,否则只能以旧有用户权限运行,这种方式可以使管理员和用户拥有不同的权限等级,从而降低系统被攻击的风险。

三、UAC实现过程

UAC的实现过程可以分为以下几个步骤:

1、确定当前用户是否有管理员权限

2、如果没有管理员权限,提升权限等级

3、通过API获取权限掩码

4、访问资源并执行操作

以下是一个简单的代码示例:

BOOL IsUserAdmin()
{
    BOOL fReturn = FALSE;
    DWORD dwStatus;
    DWORD dwAccessMask;
    DWORD dwAccessDesired;
    DWORD dwACLSize;
    DWORD dwStructureSize = sizeof(PRIVILEGE_SET);
    PACL pACL = NULL;
    PSID pSIDAdmin = NULL;

    HANDLE hToken = NULL;
    PRIVILEGE_SET ps;
    GENERIC_MAPPING GenericMapping;
    SECURITY_DESCRIPTOR sd;
    SECURITY_DESCRIPTOR sdAdmin;
    SECURITY_QUALITY_OF_SERVICE sqos;
    ULONG lInfoLength;

    GenericMapping.GenericRead = GENERIC_READ;
    GenericMapping.GenericWrite = GENERIC_WRITE;
    GenericMapping.GenericExecute = GENERIC_EXECUTE;
    GenericMapping.GenericAll = GENERIC_ALL;

    dwStatus = 
    AllocAndInitializeSid(
        &gSystemSidAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &pSIDAdmin);

    if (dwStatus == ERROR_SUCCESS) 
    {
        if (ImpersonateSelf(SecurityImpersonation) == TRUE) 
        { 
            if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken) == FALSE) 
            {
                if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) == FALSE) 
                {
                    RevertToSelf();
                    goto Cleanup; 
                }
            }

            if (hToken != NULL)
            {
                if (AccessCheck(&sd, hToken, dwAccessDesired, &GenericMapping, &ps, &dwStructureSize, &dwStatus, &fReturn)) 
                {
                    if (fReturn) 
                    {
                        // ... User is an admin
                    }
                }

                CloseHandle(hToken);
            }

            RevertToSelf();
        }
    }

Cleanup:
    if (pSIDAdmin)
        FreeSid(pSIDAdmin);
    if (pACL)
        LocalFree(pACL);

    return(fReturn);
}

四、UAC的优缺点及适用范围

优点:

1、Windows系统管理员和普通用户权限能够分别独立管理,降低了管理员被攻击的风险;

2、提供了一个规则化的、标准化的管理策略,方便管理;

3、可以通过SDK对API调用进行限制,提高系统的稳定性。

缺点:

1、弹出过多的UI界面,降低了用户体验;

2、会对进程的CPU和内存资源造成额外开销,降低系统性能;

3、在特殊情况下(如病毒篡改或者UAC弹窗伪造),会影响系统安全。

适用范围:

用户账户控制几乎适用于任何需要对安全性进行控制的Windows应用程序,特别是那些需要系统管理员权限才能运行的程序。在家庭电脑上,用户不一定需要用到UAC,但在商务办公场景,使用UAC可以大大提高系统的安全性。