c++ - PS 和 C++ 之间可能存在的编码问题
问题描述
我有一个使用 Qt 编写的 C++ 程序,我将其用作创建 AD 帐户的前端。本质上,我启动了一个提升的进程,该进程在提升的 PowerShell 会话中执行 PowerShell 命令。我可以很好地创建帐户,但是当我尝试从现有用户中提取会员资格以将其复制到新用户时,它失败了。我需要了解它为什么失败并解决问题,非常感谢任何帮助。它失败并出现以下错误:
Get-ADUser : Cannot validate argument on parameter 'Identity'. The argument is null. Provide a valid value for the
argument, and then try running the command again.
At line:2 char:28
+ "}); $groups = (Get-ADUser $tmpusr -Properties MemberOf).MemberOf; $u ...
+ ~~~~~~~
+ CategoryInfo : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser
该$tmpusr
变量只是duser.template_user
从 a 中提取的值,QComboBox
并且绝对不为空,因为它正确输出并显示所选模板帐户。在 C++ 中,它只是添加到结构成员的数据:
duser.set_groups_command = "$tmpusr = (Get-ADUser -Filter {Name -like " "\"" + duser.template_user + "\"" "}); "
"$groups = (Get-ADUser $tmpusr -Properties MemberOf).MemberOf; "
"$usr = " "\"" + duser.sam_name + "\"" + "; "
"Foreach ($group in $groups) {Add-ADGroupMember -Identity (Get-ADGroup $group).name -Members $usr} ";
如果我剥离 C++ 并在 PowerShell 中运行相同的命令,它执行得很好:
$tmpusr = (Get-ADUser -Filter {Name -like "Example User"}); $groups = (Get-ADUser $tmpusr -Properties MemberOf).MemberOf; $usr = "TestUser"; Foreach ($group in $groups) {Add-ADGroupMember -Identity (Get-ADGroup $group).name -Members $usr}
该命令的目的是确定“示例用户”属于哪些组,然后将“TestUser”添加到相同的组中。同样,创建用户工作正常。这是通过以下方式完成的:
duser.complete_command = p + "New-ADUser -Name " + "\"" + duser.employe_name +"\"" + " -GivenName " + "\"" + duser.given_name + "\""
+ " -Surname " + "\"" + duser.surname + "\"" + " -AccountPassword $sec " + " -UserPrincipalName " + "\"" + duser.userpname + "\""
" -DisplayName " + "\"" + duser.display_name + "\"" + " -EmailAddress " + "\"" + duser.email_address + "\"" + " -SamAccountName " +
"\"" + duser.sam_name + "\"" + " -Enabled " + duser.is_enabled;
您会注意到“p”的存在,它是之前创建的另一个 QString,用于转换为安全字符串。唯一的其他组件是提升和执行的功能:
void MainWindow::elevate_and_execute(QString param)
{
QProcess *process = new QProcess();
QStringList params = QStringList();
params = QStringList({"-Command", QString("Start-Process -Verb runAs powershell; "), param});
process->startDetached("powershell", params);
process->waitForFinished();
process->terminate();
}
解决方案
我能够解决这个问题。我发现当我从其中拉出所谓的模板用户时,QComboBox
它包含一个回车符。我已将日志写入文本文件,发现它正在将其推送到下一行;所以$tmpusr
被打破了。我能够通过在duser.template_user
最初填充变量时修改变量来"\r"
解决问题remove(QChar('\r'))
推荐阅读
- javascript - onclick JavaScript 执行的循环函数
- python - PyTorch,根据数据列中的标签选择批次
- lib - heif-convert 错误:JPEG 支持尚未编译
- php - 可以通过用户输入转义字符串吗?
- java - 如何解决 NoClassDefFoundError:Apache Commons Lang Android
- node.js - 应用程序无法正确启动 (0xc0000022)
- python - 如何从python连续调用powershell命令
- python - CSV 文件在 R 中给出
- python - IP列表并获取谁拥有它们
- mysql - MySQL 排序由两个 culmns 性能