univers1314 2026-01-23 16:44 采纳率: 38.5%
浏览 6

C++执行 system("query user")命令报错。查询当前登陆的帐户。

C++执行 system("query user")命令报错。
我在动行里执行“query user”查询当前登陆的帐户,是正常的。再执行“query user > C:\id.txt”也是正常的,他会在D盘保存一个记事本。见图1
但是我把这个命令放在C++里就报错了:'query' 不是内部或外部命令,也不是可运行的程序 或批处理文件。见图2
dir命令都可以执行,难到query user是特殊权限才行嘛?

img

img

#include "stdafx.h"
#include <stdio.h>
#include <Winsock2.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#include <tlhelp32.h> //头文件
#include<tchar.h>

int main()
{
    system("dir");        //列出目录
    system("query user");    //查询登陆的用户
    system("query user > C:\id.txt");    //查询登陆的用户 并保存id.txt记事本
    return 0;
}
  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2026-01-23 16:45
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在 C++ 中使用 system("query user") 报错 “'query' 不是内部或外部命令” 的问题,通常与以下几点有关:


    ✅ 问题原因分析

    1. query user 是 Windows 命令行工具中的一个命令,但它不是标准的系统命令(如 dircd 等),而是属于 Windows 操作系统的特定命令

      • 该命令需要在具有管理员权限的 CMD 或 PowerShell 中运行,或者通过特定方式调用。
    2. C++ 中 system() 函数执行的是当前用户的命令解释器(通常是 cmd.exe),但某些命令可能因路径、权限或环境变量的问题无法被识别。

    3. system("query user > C:\id.txt") 虽然可以保存到文件,但可能只是因为重定向操作本身没有报错,而 query user 本身仍然存在问题

    4. dir 命令可以正常运行是因为它是一个内置的命令,而 query user 可能不在当前的 PATH 环境变量中


    🔧 解决方案

    ✅ 1. 使用 cmd /c 执行命令

    确保命令是在 cmd.exe 中运行,而不是直接由 system() 执行。

    system("cmd /c query user");
    

    注意: cmd /c 表示执行完命令后关闭命令提示符。

    ✅ 2. 使用 CreateProcess 替代 system()

    如果你需要更精细地控制命令执行过程,推荐使用 CreateProcess API 来启动进程。

    #include <windows.h>
    #include <iostream>
    
    int main() {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
    
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));
    
        // 启动命令行解释器并执行 "query user"
        if (!CreateProcess(
            NULL,           // No module name (use command line)
            "cmd.exe /c query user",   // Command line
            NULL,           // Process handle not inheritable
            NULL,           // Thread handle not inheritable
            FALSE,          // Set handle inheritance to FALSE
            0,              // No creation flags
            NULL,           // Use parent's environment block
            NULL,           // Use parent's starting directory 
            &si,            // Pointer to STARTUPINFO structure
            &pi             // Pointer to PROCESS_INFORMATION structure
        )) {
            std::cerr << "CreateProcess failed (" << GetLastError() << ").\n";
            return 1;
        }
    
        // Wait until child process exits.
        WaitForSingleObject(pi.hProcess, INFINITE);
    
        // Close process and thread handles. 
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    
        return 0;
    }
    

    优点: 更安全、更灵活,避免了 system() 的潜在风险。


    ✅ 3. 检查权限问题

    如果 query user 需要管理员权限,那么你的程序可能没有以管理员身份运行。

    • 右键点击你的可执行文件 → “以管理员身份运行”。

    ✅ 4. 使用 WTSQuerySessionInformation API 获取用户信息(推荐)

    如果你的目标是获取当前登录用户的账户信息,可以直接使用 Windows API 调用,而无需依赖命令行工具。

    #include <windows.h>
    #include <wtsapi32.h>
    #include <iostream>
    
    #pragma comment(lib, "wtsapi32.lib")
    
    int main() {
        DWORD sessionCount = 0;
        PWTS_SESSION_INFO pSessionInfo = nullptr;
    
        if (WTSEnumerateSessions(WTS_CURRENT_SERVER, 0, 1, &pSessionInfo, &sessionCount)) {
            for (DWORD i = 0; i < sessionCount; ++i) {
                WTS_SESSION_INFO* pSession = &pSessionInfo[i];
                std::cout << "Session ID: " << pSession->SessionId << "\n";
                std::cout << "User Name: " << pSession->UserName << "\n";
                std::cout << "State: " << pSession->State << "\n\n";
            }
            WTSFreeMemory(pSessionInfo);
        } else {
            std::cerr << "Failed to enumerate sessions.\n";
        }
    
        return 0;
    }
    

    优点: 完全避免了使用命令行,更加稳定和高效。


    📌 总结

    | 方法 | 说明 | 推荐度 | |------|------|--------| | system("cmd /c query user") | 简单修改原代码 | ⭐⭐⭐ | | CreateProcess | 更安全、更灵活 | ⭐⭐⭐⭐⭐ | | WTSQuerySessionInformation | 最推荐,完全不依赖命令行 | ⭐⭐⭐⭐⭐ |


    📝 附:建议你改用 WTSQuerySessionInformation API 实现功能

    如果你只是想查询当前登录用户的信息,强烈建议使用 Windows API 实现,这样更可靠、更高效。

    如果你有其他需求(如保存到文件、处理多用户等),也可以告诉我,我可以帮你扩展代码。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月23日