【问题标题】:How to start Interactive Processes Remotely using WMI?如何使用 WMI 远程启动交互式进程?
【发布时间】:2013-10-04 11:01:55
【问题描述】:


我正在使用 WMI 远程启动交互式进程 (refer this)

Const INTERVAL = "n"
Const MINUTES  = 1
strComputer = "machineDomain"
strCommand  = "Notepad.exe"

Set objWMIService = _
    GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objScheduledJob = objWMIService.Get("Win32_ScheduledJob")

Set objSWbemDateTime = _
    CreateObject("WbemScripting.SWbemDateTime")
objSWbemDateTime.SetVarDate(DateAdd(INTERVAL, _
    MINUTES, Now()))

intReturnValue = objScheduledJob.Create(strCommand, _
    objSWbemDateTime.Value, False, 0, 0, True, intJobID)
WScript.Echo "Job ID: " & intJobID

问题在于上面的代码是任务将安排到下一分钟[意味着如果当前时间是上午 9:30,那么它将安排到 9:31],但我想在当前时间之后 5 秒安排任务时间。我修改了以下几行:
发件人:

Const INTERVAL = "n"
Const MINUTES  = 1

致:

Const INTERVAL = "s"
Const SECONDS  = 5

但它无法正常工作。我认为问题是当我们调用SetVarDate(DateAdd(INTERVAL, _ SECONDS, Now())) SECONDS 时会被添加到当前时间,例如如果当前时间是上午 9:30:20,那么计划时间将为上午 9:30:25,但如果时间当前时间是 9:30 :57 AM 那么问题就来了。

谁能帮我解决这个问题?

提前致谢。

编辑:
为了在我使用以下代码[^] 调用上述 vbscript 代码:

            string remoteMachine = Console.ReadLine();
            string sBatFile = string.Empty;
            if (remoteMachine != string.Empty)
                sBatFile = @"\\" + remoteMachine + "\\admin$\\process.bat";
            else
                Console.WriteLine("Invalid Machine name");

            if (File.Exists(sBatFile))
                File.Delete(sBatFile);

            StreamWriter sw = new StreamWriter(sBatFile);
            string _cmd = "DIR > \\\\" + remoteMachine + "\\admin$\\output.txt";
            Console.Write("Enter the remote Command <eg : Notepad.exe, Dir, Shutdown - r, etc..> : ");
            _cmd = Console.ReadLine();
            if ( _cmd.Trim()==string.Empty )
                Console.WriteLine("No command entered using default command for test :" + _cmd);
            sw.WriteLine(_cmd);
            sw.Close();
            ConnectionOptions connOptions = new ConnectionOptions();
            connOptions.Impersonation = ImpersonationLevel.Impersonate;
            connOptions.EnablePrivileges = true;
            ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", remoteMachine), 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"] = sBatFile;            
            ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);
            Console.WriteLine("Creation of the process returned: " + outParams["returnValue"]);
            Console.WriteLine("Process ID: " + outParams["processId"]);

它工作正常,但经过一些尝试后它开始出现异常:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

如何解决这个问题?

【问题讨论】:

    标签: c# .net vbscript process wmi


    【解决方案1】:

    我不确定我是否正确理解了您的问题,但听起来本地时间与远程计算机上的时间存在差异。 您可能想在远程机器上获取时间,然后使用它而不是“现在”。

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * From Win32_LocalTime")
    
    For Each objItem in colItems
    If objItem.Hour > 12 Then
        intHour = objItem.Hour - 12
        strAMPM = "PM"
    Else
        intHour = objItem.Hour
        strAMPM = "AM"
    End If 
    strTime = objItem.Month & "/" & objItem.Day & "/" & objItem.Year & " " _
        & intHour & ":" & objItem.Minute & ":" & objItem.Second & " " & strAMPM
    Next
    

    那你就可以了

    objSWbemDateTime.SetVarDate(DateAdd(INTERVAL,MINUTES, strTime))
    

    【讨论】:

    • 您可以检查此代码以确保它在午夜运行,此时 objItem.Hour 将等于 0。我现在才注意到这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多