0


WMIを使用してリモートでインタラクティブプロセスを開始しています(これを参照してください

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()))現在の時刻が午前 9:30:20 の場合、スケジュール時刻は午前 9:30:25 になりますが、現在の時刻が午前 9:30:57 の場合、SECONDSを呼び出すと現在の時刻に追加されることが問題だと思います。それは問題になります。

誰でもこの問題を解決するのを手伝ってくれますか?

前もって感謝します。

EDIT:
上記の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))

この問題を解決するには?

4

1 に答える 1

2

あなたの質問を正しく理解しているかどうかわかりませんが、現地時間とリモート マシンの時間にずれがあるようです。リモート マシンの時刻を取得し、「今」の代わりにそれを使用することもできます。

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))
于 2013-10-04T21:17:59.677 に答える