有没有办法识别Windows命令提示符,无论文件名或位置如何?

时间:2011-10-27 16:42:36

标签: c++ windows process command-prompt

我正在编写一个程序,以便在用户运行命令提示符时立即跟踪并终止(如果可能,则使用regedit)。这是为了阻止用户运行我希望他们没有的命令。

我已经编写了代码,可以查看启动进程的时间并使用QueryFullProcessImageName检查其名称。问题是,如果有人要重命名命令提示符,那么我将无法再通过进程名称检测到它。我检测命令提示符的方式当前是“\ cmd.exe”,但显然这不是很安全。

以下是我对代码的解释。为简洁起见,我删除了所有错误检查。如果您需要更清晰,请告诉我。谢谢!

TCHAR exeName[MAX_PATH];
DWORD exeNameSize = MAX_PATH;

//the pid comes into the function as a parameter
HANDLE handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid);

if (handle) 
{
    if (QueryFullProcessImageName(handle, 0, exeName, &exeNameSize))
    {
        tstring name = exeName;

        /*
          badProcs would contain the path identifiers such as
          "\\cmd.exe" or "\\regedit.exe".  This detection is
          what I want to make better.
        */

        for(int i=0; i < badProcs.size(); i++)
        {
            if(tstring::npos != name.find(badProcs.at(i)))
            {
                if(TerminateProcess(handle,0))
                    OutputDebugString(_T("Process should be dead\n\n"));
            }
        }
    }
    CloseHandle(handle);
}

一些其他信息:我写这篇文章的原因是为了控制其他桌面上发生的事情。我想这样做,以便当用户启动一个不同的桌面(通过任何专有程序)时,我可以控制他们是否可以访问对系统提出最大安全漏洞的项目。鉴于我只想控制其他桌面上的操作,我不想更改设置,以免损坏目标桌面之外的数据。腐败不是值得担心的吗?

我只对控制专有桌面感兴趣,而不是在用户自己的空间中做些什么。基本上,单独的桌面用于公司工作,我希望能够限制人们可以用公司信息等做什么。

2 个答案:

答案 0 :(得分:10)

别。 Windows有内部手段。阅读策略编辑器和/或文件访问控制。

如果您是管理员且“用户”不是,则策略(或简单ACL)将完成工作;如果“用户”也是管理员,他们将能够相当轻松地击败你的程序。

答案 1 :(得分:1)

阻止命令提示符和注册表编辑器的最佳方法是通过Windows注册表。即使您将可执行文件复制到其他位置,这些也可以正常工作。

如果设置了注册表项,则无法运行注册表编辑器和命令提示符:

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\DisableRegistryTools

或整个机器

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\System\DisableRegistryTools

将此设置为1将禁用regedit,设置为0将启用它。

HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\DisableCMD

(本地机器varient也在这里工作)。

将此项设置为1将禁用命令提示符批处理文件,将此项设置为2将仅禁用命令行,设置为0将启用它。