最近在写关于win10系统下修改网络配置的代码,程序中使用了netsh这个命令,代码如下(部分参考自网上的代码,抱歉忘了出处):
if(ui->Network_ipnamed->isChecked()){
QString ip = ui->Network_ip_p->text();
QString netmask = ui->Network_submask_p->text();
QString gateway = ui->Network_gateway_p->text();
QString dns = ui->Network_dns_p->text();
QProcess p1(this);
QProcess p2(this);
QString ipmaskgateway = "netsh interface ip set address " + name + " static "+ ip + QString(" ") + netmask + QString(" ") + gateway + " 1";
QString adddns = "netsh interface ip set dnsservers " + name + " static " + dns + " PRIMARY "+" no ";
QStringList arguments1;
QStringList arguments2;
arguments1 << "/c" << ipmaskgateway;
arguments2 << "/c" << adddns;
p1.start("cmd",arguments1);
p1.waitForFinished(3000);
p2.start("cmd",arguments2);
p2.waitForFinished(3000);
QByteArray str1 = p1.readAllStandardOutput();
QByteArray str2 = p2.readAllStandardOutput();
QString strResult1 = QString::fromLocal8Bit(str1);
QString strResult2 = QString::fromLocal8Bit(str2);
if(strResult1 == "\r\n" && strResult2 == "\r\n"){
WidgetPrompt::showPromptTimer("修改成功!");
}else{
WidgetPrompt::showPrompt(QString("服务器修改成功!\n本机设置失败!\nIP: %1DNS: %2").arg(strResult1).arg(strResult2), Qt::AlignLeft);
}
}
else{
QProcess p1(this);
QProcess p2(this);
QString ipmaskgateway = "netsh interface ip set address " + name + " dhcp ";
QString adddns = "netsh interface ip set dnsservers " + name + " dhcp ";
QStringList arguments1;
QStringList arguments2;
arguments1 << "/c" << ipmaskgateway;
arguments2 << "/c" << adddns;
p1.start("cmd",arguments1);
p1.waitForFinished(3000);
p2.start("cmd",arguments2);
p2.waitForFinished(3000);
QString strResult1 = QString::fromLocal8Bit(p1.readAllStandardOutput());
QString strResult2 = QString::fromLocal8Bit(p2.readAllStandardOutput());
if(strResult1 == "\r\n" && strResult2 == "\r\n"){
WidgetPrompt::showPrompt("修改成功!");
}else{
WidgetPrompt::showPrompt("服务器修改成功!\n本机设置失败!\nIP: "+ strResult1 + "DNS: "+ strResult2, Qt::AlignLeft);
}
}
测试发现,应用程序在一台电脑上可以设置网络成功,在另一台上却始终失败,通过对比发现,两者的网络名称不同,一台为“以太网”,另一个为“Ethenet 2”, 问题就出在了第二个的名字上,由于其中有空格,而在代码中ipmaskgateway,adddns 的name是直接放在字符串中的,这个空格导致了设置失败。将其中的name加上引号,问题解决,ipmaskgateway,adddns 修改后的代码如下:
QString ipmaskgateway = "netsh interface ip set address " + QString("\"%1\"").arg(name) + " static "+ ip + QString(" ") + netmask + QString(" ") + gateway + " 1";
QString adddns = "netsh interface ip set dnsservers " + QString("\"%1\"").arg(name) + " static " + dns + " PRIMARY "+" no ";
QString ipmaskgateway = "netsh interface ip set address " + QString("\"%1\"").arg(name)+ " dhcp ";
QString adddns = "netsh interface ip set dnsservers " + QString("\"%1\"").arg(name)+ " dhcp ";