打开远程机器应用程序

时间:2012-07-22 12:00:06

标签: c#

我正在尝试在Windows 7 64上打开远程应用程序(记事本)。 这就是我的尝试:

object[] theProcessToRun = {"notepad"};
ConnectionOptions theConnection = new ConnectionOptions();
theConnection.Username = "user";
theConnection.Password = "pass";
ManagementScope theScope = new ManagementScope("\\\\" + ip + "\\root\\cimv2",
                                     theConnection);
ManagementClass theClass = new ManagementClass(theScope, 
                 new ManagementPath("Win32_Process"), new ObjectGetOptions());
theClass.InvokeMethod("Create", theProcessToRun);

此代码仅在任务管理器中打开记事本。 我怎样才能使记事本可见。

感谢。

1 个答案:

答案 0 :(得分:2)

未显示的流程为by design for security purposes in WMI。我所知道的最好的选择是使用Win32_ScheduledJob来安排应用程序以交互方式启动的时间。

以下代码未经测试,但我认为应该通过一些调整来做你想做的事。

using System;
using System.Management;
using System.Reflection;

class ScheduleJob
{
    public static uint Create (
string Command,
uint DaysOfMonth,
uint DaysOfWeek,
bool InteractWithDesktop,
bool RunRepeatedly,
string StartTime, // in DMTF format !
out uint JobId)
    {
// See: Platform SDK (or WMI SDK) doc's for detailed info about 'Win32_ScheduledJob' class
        ManagementBaseObject inputArgs = null;
        ManagementClass classObj = new ManagementClass (null, "Win32_ScheduledJob", null);
        inputArgs = classObj.GetMethodParameters ("Create");
        inputArgs ["Command"] = Command;
        inputArgs ["DaysOfMonth"] = DaysOfMonth;
        inputArgs ["DaysOfWeek"] = DaysOfWeek;
        inputArgs ["InteractWithDesktop"] = InteractWithDesktop;
        inputArgs ["RunRepeatedly"] = RunRepeatedly;
        inputArgs ["StartTime"] = StartTime;
// use late binding to invoke "Create" method on "Win32_ScheduledJob" WMI class
        ManagementBaseObject outParams = classObj.InvokeMethod ("Create", inputArgs, null);
        JobId = ((uint)(outParams.Properties ["JobId"].Value));
        return ((uint)(outParams.Properties ["ReturnValue"].Value));
    }
// Delete the Scheduled (JobID)

    public static uint Delete (uint JobID)
    {
        ManagementObject mo;
        ManagementPath path = ManagementPath.DefaultPath;
        path.RelativePath = "Win32_ScheduledJob.JobId=" + "\"" + JobID + "\"";
        mo = new ManagementObject (path);
        ManagementBaseObject inParams = null;
// use late binding to invoke "Delete" method on "Win32_ScheduledJob" WMI class
        ManagementBaseObject outParams = mo.InvokeMethod ("Delete", inParams, null);
        return ((uint)(outParams.Properties ["ReturnValue"].Value));
    }

    public static string ToDMTFTime (DateTime dateParam)
    {
        string tempString = dateParam.ToString ("********HHmmss.ffffff");
        TimeSpan tickOffset = TimeZone.CurrentTimeZone.GetUtcOffset (dateParam);
        tempString += (tickOffset.Ticks >= 0) ? '+' : '-';
        tempString += (Math.Abs (tickOffset.Ticks) / System.TimeSpan.TicksPerMinute).ToString ("d3");
        return tempString;
    }
}

class JobScheduler
{
    public static void Main ()
    {
        uint JobID;
        DateTime dt = DateTime.Now; // Get current DateTime
        dt = dt.AddMinutes (1); //add 1 minute to current time
        string LocalDateTime = ScheduleJob.ToDMTFTime (dt); // convert to DMTF format
// Schedule Notepad to run every Sunday and Wednesday
        uint ret = ScheduleJob.Create (
// @"runas /user:administrator\domain /profile cmd ",
@"c:\winnt\notepad.exe",
0, 32, true, true, LocalDateTime, out JobID);
        if (ret == 0) { // sucess
            Console.WriteLine ("Wait for Job to be scheduled and Press: <Enter> to delete");
            Console.ReadLine (); // For test purposes - Wait for job to be scheduled.
            ret = ScheduleJob.Delete (JobID); // Get rid of this Job
        }
        Console.WriteLine (ret);
    }
}

/* Days of week
Sunday 64,
Monday 1,
Tuesday 2,
Wednesday 4,
Thursday 8,
Friday 16,
Saturday 32

*/