从此 GPO 读取策略时出错,并未显示所有策略

从此 GPO 读取策略时出错,并未显示所有策略

我正在努力实现一个自动服务质量(QoS)策略创建器,使用“新 NetQosPolicy”PowerShell 命令。我有一个 C++ 脚本,可以执行此命令来限制特定应用程序(例如 Firefox)的带宽。

这是我正在使用的命令:“New-NetQosPolicy -名称 firefox.exe -AppPathNameMatchCondition“firefox.exe”-ThrottleRateActionBitsPerSecond 5MB -IPProtocolMatchCondition Both -NetworkProfile All”

脚本如下:

//create QoS policy
std::string command = "powershell New-NetQosPolicy -Name " + appName + " -AppPathNameMatchCondition \"" + appName + "\" -ThrottleRateActionBitsPerSecond " + std::to_string(bandwidthLimit) + "MB -IPProtocolMatchCondition Both -NetworkProfile All";
std::cout << command << std::endl;
system(command.c_str());
     
qosNames.push_back(appName);
std::cout << "Bandwidth limit applied for " << appName << ": " << bandwidthLimit << " Kbps" << std::endl;

运行该命令后,我可以在输出中看到该策略“获取 NetQosPolicy”命令,并且看起来配置正确。

输出如下:

Name: firefox.exe
Owner : Group Policy(Machine)
NetworkProfile : All
Precedence : 127
AppPathName : firefox.exe
JobObject :
IPProtocol: Both
ThrottleRate : 5.243 MBits / sec

但是,QoS 策略似乎不适用于 Firefox。当我尝试在组策略编辑器中查看该策略时,遇到错误:“从此 GPO 读取策略时出错,并未显示所有策略。”单击策略选项卡。

不过,当我手动设置 QoS 时,它似乎工作正常。我希望有人能解决我的问题,或者知道如何使用注册表编辑命令创建这些策略。任何关于为什么会发生这种情况的见解都将不胜感激。

如果有帮助的话,我在测试期间附加了事件日志的自定义视图这里, 它包含使用上面提供的相同命令来创建 QoS。

答案1

我最终通过创建我需要的命令的自己的版本来解决了我的问题,我不知道“新 NetQosPolicy”不是用来做我使用它要做的事情,或者我误解了如何使用它。无论如何,我从来没有真正修复过命令本身。

无论如何,这是我最终创建和使用的代码。

void createQoS(std::string QoS_Name, std::string path, std::string ThrottleRate) {
    std::list<std::string> commandList;

    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v Version /t REG_SZ /d " + "1.0");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Application Name\" /t REG_SZ /d " + path);
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v Protocol /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Local Port\" /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Local IP\" /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Local IP Prefix Length\" /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Remote Port\" /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Remote IP\" /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Remote IP Prefix Length\" /t REG_SZ /d " + "*");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"DSCP Value\" /t REG_SZ /d " + "-1");
    commandList.push_back("reg add HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /v \"Throttle Rate\" /t REG_SZ /d " + ThrottleRate);
    commandList.push_back("gpupdate /force");

    for (const std::string& command : commandList) {
        std::cout << command << std::endl;
        system(command.c_str());
    }
    
}

void removeQoS(std::string QoS_Name) {
    std::list<std::string> commandList;

    commandList.push_back("reg delete HKCU\\Software\\Policies\\Microsoft\\Windows\\QoS\\" + QoS_Name + " /f");
    commandList.push_back("gpupdate /force");

    for (const std::string& command : commandList) {
        std::cout << command << std::endl;
        system(command.c_str());
    }
}

它通过将 QoS 直接添加到注册表来创建一个限制带宽使用的 QoS。第二个命令从注册表中删除 QoS。请谨慎,因为如果不使用此删除命令,那么当手动从注册表中删除 QoS 时,它仍会残留并因某种原因产生影响。

相关内容