【问题标题】:Logoff remote system using c++使用 C++ 注销远程系统
【发布时间】:2022-09-27 09:38:48
【问题描述】:

我正在寻找一个 API 来注销远程计算机上的当前用户。二 功能 ExitWindows 和 InitiateSystemShutdown 似乎不完全是我 想。第一个不接受计算机名,第二个不接受 有注销选项。是否可以注销当前用户 在远程计算机上?有人可以告诉我如何在 C++程序?

  • 你不能远程从另一个系统注销。您必须在要注销的本地系统上运行注销代码。这意味着将您的代码编译成可执行文件,将该可执行文件上传到远程系统,并在该系统上运行该可执行文件

标签: c++ winapi wmi remote-access logoff


【解决方案1】:

我知道您想使用 exitwindows 功能关闭系统。 但是,如果要在自己的进程中关闭远程系统,则需要使用 exitwindowsEX 函数,并编写一个指定进程 ID 的程序。 相关功能参考如下: https://learn.microsoft.com/zh-cn/windows/win32/shutdown/how-to-shut-down-the-system 以下是具体代码:

#pragma region  
#include<windows.h>
#pragma warning(disable:4996)
BOOL ReSetWindows(DWORD dwFlags, BOOL bForce)
{ 
    if (dwFlags != EWX_LOGOFF && dwFlags != EWX_REBOOT && dwFlags != EWX_SHUTDOWN)
        return FALSE;
    
    OSVERSIONINFO osvi = { 0 };
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    if (!GetVersionEx(&osvi))
    {
        return FALSE;
    }
    
    if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        //EnableShutDownPriv();  
    }
   
    dwFlags |= (bForce != FALSE) ? EWX_FORCE : EWX_FORCEIFHUNG;
     
    return ExitWindowsEx(dwFlags, 0);
}
int main()
{
    ReSetWindows(EWX_LOGOFF, false);//logoff
    //ReSetWindows(EWX_REBOOT, true);//restart
   //ReSetWindows(EWX_SHUTDOWN, true);//shutdown
}

======================== 注意!!!在虚拟机中运行或运行前请保存好您的重要文件

【讨论】:

  • 这仅用于本地机器关闭,如何在远程系统中使用它? ,对不起,我没有得到这个 - “写一个指定进程ID的程序”,你能提供任何例子吗?
【解决方案2】:

这是程序指定进程ID:

DWORD GetProcessIDByName(LPCTSTR szProcessName)
{
    STARTUPINFO st;
    PROCESS_INFORMATION pi;
    PROCESSENTRY32 ps;
    HANDLE hSnapshot;
    DWORD dwPID = 0;
    ZeroMemory(&st, sizeof(STARTUPINFO));
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    st.cb = sizeof(STARTUPINFO);
    ZeroMemory(&ps, sizeof(PROCESSENTRY32));
    ps.dwSize = sizeof(PROCESSENTRY32);
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)//
    {
        return dwPID;
    }
    if (!Process32First(hSnapshot, &ps))
    {
        return dwPID;
    }
    do
    {
        if (lstrcmpi(ps.szExeFile, szProcessName) == 0)
        {
            dwPID = ps.th32ProcessID;
        }
    } while (Process32Next(hSnapshot, &ps)); 
    CloseHandle(hSnapshot);
    return dwPID;//
}

你的 main 函数中需要这行代码:

DWORD pId = GetProcessIDByName("\\\.exe");

通过本地机器关闭远程系统很容易。远程机器关闭本地机器听起来像病毒。没有冒犯,很难实施。也许您可以尝试使用套接字将本地机器与虚拟机通信。

【讨论】:

    【解决方案3】:

    可以使用远程线程注入、钩子注入等方法注入回答上述问题的代码。但是,注入的进程可能会被杀毒软件当作病毒杀死。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2017-11-27
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多