首页 > 解决方案 > 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();

 }

标签: c++powershell

解决方案


我能够解决这个问题。我发现当我从其中拉出所谓的模板用户时,QComboBox它包含一个回车符。我已将日志写入文本文件,发现它正在将其推送到下一行;所以$tmpusr被打破了。我能够通过在duser.template_user最初填充变量时修改变量来"\r"解决问题remove(QChar('\r'))


推荐阅读