2

我正在使用 WMI 作为域管理员连接到我的实验室机器。然后我运行这个命令行来创建一个打印机:

cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs -a -p Test002 -m "Canon Inkjet iP100 series" -r FAKE002

这很好用。

然后我运行此命令行将打印机设置为默认值:

cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs -t -p Test002

那根本行不通。

一些相关的细节:

  • 两条命令行都是用同样的方法执行的
  • 如果我通过具有本地范围的 WMI 运行第二个命令行,则它可以正常工作
  • 我正在运行脚本的用户在机器上具有管理员权限,并且可以手动设置默认打印机
  • 我正在创建远程范围的用户参数属于域管理员。
  • 当我远程运行脚本时,它会报告成功。没有看到错误。

我完全不明白为什么使用远程 WMI 调用具有不同参数的相同脚本不起作用。我花了几个小时搜索并没有找到足够的答案。

这是我用来创建连接到远程机器的范围的方法:

public static ManagementScope CreateScope() {
        string nameSpace = @"\\" + Parameters.FQDN + @"\root\cimv2";

        ManagementPath path = new ManagementPath(nameSpace);
        ConnectionOptions Connection = new ConnectionOptions();
        Connection.Username = Parameters.User;  // Username value includes the domain
        Connection.Password = Parameters.Password;
        Connection.Impersonation = ImpersonationLevel.Impersonate;

        return new ManagementScope(path, Connection);

}

谁能告诉我为什么第二个命令行没有将远程机器上的打印机设置为默认打印机?

4

1 回答 1

0

希望这可以帮助。我建议您在运行时使用您的两个命令创建一个批处理文件并以这种方式创建一个进程。但是现在测试你遇到问题的最终命令,如下所示: -

string Command = @"cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs -t -p Test002";

ManagemenConnectionOptions connOptions = new ConnectionOptions();
connOptions.Impersonation = ImpersonationLevel.Impersonate;
connOptions.EnablePrivileges = true;
tScope manScope = new ManagementScope
    (String.Format(@"\\{0}\ROOT\CIMV2", Parameters.FQDN), connOptions);
manScope.Connect();

ObjectGetOptions objectGetOptions = new ObjectGetOptions();
ManagementPath managementPath = new ManagementPath("Win32_Process");
ManagementClass processClass = new ManagementClass
    (manScope, managementPath, objectGetOptions);
ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
inParams["CommandLine"] = Command; 

ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);
Console.WriteLine("Creation of the process returned: " + outParams["returnValue"]);
Console.WriteLine("Process ID: " + outParams["processId"]);
于 2013-02-05T08:50:55.080 回答