1

これまでのところ、私のコードは、ターゲット コンピューターでコマンド ライン引数を使用してプロセス (アプリケーションのインストール) を開始し、インストール ファイルをそのコンピューターにコピーすると、プロセスが終了するのを待ちます。

私の目標は次のとおりです。

  1. リモート コンピューターでコマンド ライン引数 (アプリケーションのインストール) を使用してプロセスを開始します。
  2. ファイルをリモート コンピューターにコピーしないでください。インストーラー ファイルは、送信側コンピューターとリモート コンピューターの両方がアクセスできるネットワーク共有に配置されます。
  3. プロセスが完了するまで待ちます。

どんな助けでも大歓迎です!

    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");
            }
        }
4

0 に答える 0