1

So far my code will start a process (Install an application) with command line arguments on a target computer and wait for the process to finish, IF I copy the install files to that computer.

My goal now is to:

  1. Start a process with command line arguments (Install an application) on the remote computer.
  2. NOT copy the files to the remote computer. The installer files will be located on a network share that both the sender computer and the remote computer have access to.
  3. Wait for the process to finish.

Any help is much appreciated!

    private void StartAppAction(string PCName, string Params)
        {   
            //Example of Params \\Server\Folder\Application.EXE /s 

            ConnectionOptions conn = new ConnectionOptions();
            conn.Impersonation = ImpersonationLevel.Impersonate;
            conn.Authentication = AuthenticationLevel.Default;
            conn.EnablePrivileges = true;
            ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", PCName), conn);

            try
            {
                manScope.Connect();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            ObjectGetOptions objOpt = new ObjectGetOptions();
            ManagementPath manPath = new ManagementPath("Win32_Process");
            ManagementClass manClass = new ManagementClass(manScope, manPath, objOpt);
            ManagementBaseObject inParams = manClass.GetMethodParameters("Create");
            inParams["CommandLine"] = Params;
            ManagementBaseObject outParams = manClass.InvokeMethod("Create", inParams, null);

            string query = String.Format("SELECT * FROM __InstanceDeletionEvent WITHIN 3 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.ProcessID = '{0}'", outParams["ProcessId"].ToString());

            string scope = @"\\" + PCName + @"\root\CIMV2";

            EventWatcherOptions evOp = new EventWatcherOptions(null, new TimeSpan(1, 0, 0), 1);
            ManagementEventWatcher manWatch = new ManagementEventWatcher(scope, query, evOp);
            try
            {
                ManagementBaseObject watcher = manWatch.WaitForNextEvent();
                var ID = ((ManagementBaseObject)watcher["TargetInstance"]);                
                //Process Ended
            }
            catch
            {
                MessageBox.Show("Unable to watch for the remote process to finish");
            }
        }
HiTech
  • 913
  • 1
  • 16
  • 34

0 Answers0