Windows用户及组管理

一、服务器系统版本介绍

windows服务器系统:win2000、win2003、win2008、win2012
linux服务器系统:Redhat CentOS

二、用户管理

2.1 用户概述

    每一个用户登录系统后,拥有不同的操作权限。
    每个账号有自己唯一的SID(安全标识符)
    用户SID:S-1-5-21-426206823-2579496042-14852678-500
    系统SID:S-1-5-21-426206823-2579496042-14852678
        用户UID:500
        windows系统管理员administrator的UID是500
        普通用户的UID是1000开始
    不同的账户拥有不同的权限,为不同的账户赋权限,也就是为不用账户的SID赋权限!
    账户密码存储位置: C:WINDOWSsystem32configSAM   # 暴力破解,撞库
    windows系统上,默认密码最长有效期42天 

2.2 内置账户

    给人使用的账户
        administrator       # 管理员账户
        guest                # 来宾账户
    计算机服务组件相关的系统账号
        system               # 系统账户 == 权限至高无上   
        local services       # 本地服务账户 == 权限等于普通账户
        network services    # 网络服务账户 == 权限等于普通账户

2.3 配置文件

    每个用户都有自己的配置文件(家目录),在用户第一次登录时自动产生,路径是:
    win7/win2008   c:用户
    xp/win2003     C:Documents and Settings

2.4 用户管理命令

    net user                         # 查看用户列表
    net user 用户名 密码               # 改密码
    net user 用户名 密码 /add          # 创建一个新用户
    net user 用户名 /del              # 删除一个用户
    net user 用户名 /active:yes/no    # 激活或禁用账户

练习:

1、练习图形及命令行中,进行用户管理(如创建、修改密码、删除用户、登录并验证家目录产生及权限)
2、制作一个批处理脚本,可以实现互动创建用户

        @echo off
        title 用户管理v1.0 
        color 0a

        :menu
        cls
        echo =============================
        echo    1.创建用户并设置密码
        echo    2.激活账户
        echo    3.禁用账户
        echo    4.删除账户
        echo    5.提升用户为管理员
        echo    6.查看当前用户
        echo =============================

        set /p number=请您选择所需选项:

        if "%number%"=="1" goto 1
        if "%number%"=="2" goto 2
        if "%number%"=="3" goto 3
        if "%number%"=="4" goto 4
        if "%number%"=="5" goto 5
        if "%number%"=="6" goto 6
        echo "错误!请不要胡乱输入,请输入正确选项(1-6),谢谢!"
        pause
        goto menu

        :1
        set /p a=请输入用户名:
        set /p b=请输入密码:
        net user "%a%" "%b%" /add
        goto menu

        :2
        set /p a=请输入用户名:
        net user "%a%" /active:yes
        goto menu

        :3
        set /p a=请输入用户名:
        net user "%a%" /active:no
        goto menu

        :4
        set /p a=请输入用户名:
        net user "%a%" /del
        goto menu

        :5
        set /p a=请输入用户名:
        net localgroup administrators "%a%" /add
        goto menu

        :6
        net user
        pause
        goto menu

三、组管理

3.1 组概述

    组的作用:简化权限的赋予。
        赋权限方式:
            1) 用户-组-赋权限
            2) 用户-赋权限

3.2 内置组

        内置组的权限默认已经被系统赋予。
        1) administrators        # 管理员组
        2) guests                # 来宾组
        3) users                 # 普通用户组,默认新建用户组
        4) network               # 网络配置组
        5) print                 # 打印机组
        6) Remote Desktop        # 远程桌面组

3.3 组管理命令 

        net localgroup                 # 查看组列表
        net localgroup 组名             # 查看该组的成员
        net localgroup 组名 /add        # 创建一个新的组
        net localgroup 组名 用户名 /add  # 添加用户到组
        net localgroup 组名 用户名 /del  # 从组中踢出用户
        net localgroup 组名 /del        # 删除组 

练习:

  1、练习图形及命令行中,进行组管理(创建组、组成员添加、查看组成员、成员脱离组、删除组)
  2、创建1个普通用户list,并将list提升为管理员,并验证list是否成功取得管理员权限!

            net user list /add
            net localgroup administrators list /add
            net localgroup administrators 

四、服务器远程管理

4.1 远程管理类型

        1、远程桌面(图形)
        2、telnet(命令行)

4.2 远程桌面

拓扑图

Windows用户及组管理_第1张图片

 步骤:

        1.首先配置网络,并实现客户机与服务器可以互通
        2.服务器开启允许被远程控制:桌面右键属性--远程设置--选择允许--确定
        3.客户机上:开始--运行--输入mstsc 打开远程桌面连接工具
        4.在mstsc工具上输入服务器的IP点击确定
        5.输入服务器的账号及密码。

注意:如使用非管理员账户登录远程,需要在服务器上将用户加入到远程内置组Remote Desktop Users中

4.3、telnet

        netstat -an 
        查看本机开放的所有端口
        telnet:23
        远程桌面协议RDP:3389

五、破解windows系统密码

5.1  利用5次shift漏洞破解win7密码

5.1.1  漏洞

    1、在未登录系统时,连续按5次shift键,弹出程序c:WINDOWSsystem32sethc.exe
    2、部分win7及win10在未进入系统时,可以通过系统修复漏洞篡改系统文件名
    注:如win7或win10系统已修补漏洞,则无法利用

5.1.2 破解过程相关知识

    1、cmd工具路径
    c:WINDOWSsystem32cmd
    2、用户/账户密码存储位置
    c:WINDOWSsystem32configSAM     # 非逆转型加密,使用hash值类似的方法、MD5、SHA
    3、修改账户密码
    net user 用户名 密码

5.1.3 漏洞利用过程

案例 破解win7系统密码 实验步骤:

1、开启win7虚拟机,开机,并设置一个复杂密码
    2、关机,并开机,在出现windows启动界面时强制关机
    3、再开机,出现"启动修复(推荐)"及选择该项;   # 如为出现,多尝试几次第2步,如还不行,请多尝试第二步
    4、出现系统还原提示,点击取消,等待几分钟后,会出现问题原因,点击查看详细信息;
    5、打开最后一个链接即一个记事本;
    6、记事本中点打开,并选择显示所有文件;
    7、找到sethc并改名sethc-bak,在找到cmd,复制一份cmd改名成sethc.exe
    8、全部关闭,重启。  

 

#include  
#include  
#include  
#include  

#include  
#include  
#include  

struct heap_delete 
{ 
    typedef LPVOID pointer; 
    void operator()(LPVOID p) 
    { 
     ::HeapFree(::GetProcessHeap(), 0, p); 
    } 
}; 
typedef std::unique_ptr heap_unique_ptr; 

struct handle_delete 
{ 
    typedef HANDLE pointer; 
    void operator()(HANDLE p) 
    { 
     ::CloseHandle(p); 
    } 
}; 
typedef std::unique_ptr handle_unique_ptr; 

typedef uint32_t uid_t; 

BOOL GetUserSID(HANDLE token, PSID* sid) 
{ 
    if (
     token == nullptr || token == INVALID_HANDLE_VALUE 
     || sid == nullptr 
     ) 
    { 
     SetLastError(ERROR_INVALID_PARAMETER); 
     return FALSE; 
    } 
    DWORD tokenInformationLength = 0; 
    ::GetTokenInformation(
     token, TokenUser, nullptr, 0, &tokenInformationLength); 
    if(GetLastError() != ERROR_INSUFFICIENT_BUFFER) 
    { 
     return FALSE; 
    } 
    heap_unique_ptr data(
     ::HeapAlloc(
      ::GetProcessHeap(), HEAP_ZERO_MEMORY,  
      tokenInformationLength)); 
    if (data.get() == nullptr) 
    { 
     return FALSE; 
    } 
    BOOL getTokenInfo = ::GetTokenInformation(
     token, TokenUser, data.get(), 
     tokenInformationLength, &tokenInformationLength); 
    if (! getTokenInfo) 
    { 
     return FALSE; 
    } 
    PTOKEN_USER pTokenUser = (PTOKEN_USER)(data.get()); 
    DWORD sidLength = ::GetLengthSid(pTokenUser->User.Sid); 
    heap_unique_ptr sidPtr(
     ::HeapAlloc(
      GetProcessHeap(), HEAP_ZERO_MEMORY, sidLength)); 
    PSID sidL = (PSID)(sidPtr.get()); 
    if (sidL == nullptr) 
    { 
     return FALSE; 
    } 
    BOOL copySid = ::CopySid(sidLength, sidL, pTokenUser->User.Sid); 
    if (! copySid) 
    { 
     return FALSE; 
    } 
    if (!IsValidSid(sidL)) 
    { 
     return FALSE; 
    } 
    *sid = sidL; 
    sidPtr.release(); 
    return TRUE; 
} 

uid_t GetUID(HANDLE token) 
{ 
    PSID sid = nullptr; 
    BOOL getSID = GetUserSID(token, &sid); 
    if (! getSID || ! sid) 
    { 
     return -1; 
    } 
    heap_unique_ptr sidPtr((LPVOID)(sid)); 
    LPWSTR stringSid = nullptr; 
    BOOL convertSid = ::ConvertSidToStringSidW(
     sid, &stringSid); 
    if (! convertSid) 
    { 
     return -1; 
    } 
    uid_t ret = -1; 
    LPCWSTR p = ::wcsrchr(stringSid, L'-'); 
    if (p && ::iswdigit(p[1])) 
    { 
     ++p; 
     ret = ::_wtoi(p); 
    } 
    ::LocalFree(stringSid); 
    return ret; 
} 

uid_t getuid() 
{ 
    HANDLE process = ::GetCurrentProcess(); 
    handle_unique_ptr processPtr(process); 
    HANDLE token = nullptr; 
    BOOL openToken = ::OpenProcessToken(
     process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token); 
    if (! openToken) 
    { 
     return -1; 
    } 
    handle_unique_ptr tokenPtr(token); 
    uid_t ret = GetUID(token); 
    return ret; 
} 

uid_t geteuid() 
{ 
    HANDLE process = ::GetCurrentProcess(); 
    HANDLE thread = ::GetCurrentThread(); 
    HANDLE token = nullptr; 
    BOOL openToken = ::OpenThreadToken(
     thread, TOKEN_READ|TOKEN_QUERY_SOURCE, FALSE, &token); 
    if (! openToken && ::GetLastError() == ERROR_NO_TOKEN) 
    { 
     openToken = ::OpenThreadToken(
      thread, TOKEN_READ|TOKEN_QUERY_SOURCE, TRUE, &token); 
     if (! openToken && ::GetLastError() == ERROR_NO_TOKEN) 
     { 
      openToken = ::OpenProcessToken(
       process, TOKEN_READ|TOKEN_QUERY_SOURCE, &token); 
     } 
    } 
    if (! openToken) 
    { 
     return -1; 
    } 
    handle_unique_ptr tokenPtr(token); 
    uid_t ret = GetUID(token); 
    return ret; 
} 

int main() 
{ 
    uid_t uid = getuid(); 
    uid_t euid = geteuid(); 
    std::cout 
     << "uid: " << std::setbase(10) << uid << std::endl 
     << "euid: " << std::setbase(10) << euid << std::endl 
     << std::endl; 
    return EXIT_SUCCESS; 
} 

你可能感兴趣的:(Windows,c++,Windows,用户与组)