public int RunProcess( string executable, string args, bool waitForExit = false )
        {
            GuestProcessManager processManager = new GuestProcessManager( _virtualHost, _manager.ProcessManager );

            GuestProgramSpec arguments = new GuestProgramSpec
                                             {
                                                 Arguments = args,
                                                 ProgramPath = executable,
                                                 WorkingDirectory = Path.GetDirectoryName( executable )
                                             };

            long pid = processManager.StartProgramInGuest( _vm.MoRef, _authentication, arguments );
            int exitCode = 0;

            if ( waitForExit )
            {
                while ( true )
                {
                    GuestProcessInfo process = processManager.ListProcessesInGuest( _vm.MoRef, _authentication, new[] {pid} )
                        .FirstOrDefault( p => p.Pid == pid );

                    if ( process == null || process.EndTime != null )
                    {
                        if ( process != null && process.ExitCode.HasValue )
                        {
                            exitCode = process.ExitCode.Value;
                        }
                        break;
                    }

                    Thread.Sleep( 60000 );
                    processManager.UpdateViewData();
                }
            }

            return exitCode;
        }
        public int StartProcessAndWaitForExit( string processLocationInVm, string arguments )
        {
            GuestProcessManager processManager = new GuestProcessManager( _virtualMachine.Client, _manager.ProcessManager );

            GuestProgramSpec args = new GuestProgramSpec
                                        {
                                            Arguments = arguments,
                                            ProgramPath = processLocationInVm,
                                            WorkingDirectory = Path.GetDirectoryName( processLocationInVm )
                                        };

            long pid = processManager.StartProgramInGuest( _virtualMachine.MoRef, _authentication, args );
            int exitCode = 0;

            while ( true )
            {
                GuestProcessInfo process = processManager.ListProcessesInGuest( _virtualMachine.MoRef, _authentication, new[] {pid} )
                    .FirstOrDefault( p => p.Pid == pid );

                if ( process == null || process.EndTime != null )
                {
                    if ( process != null && process.ExitCode.HasValue )
                    {
                        exitCode = process.ExitCode.Value;
                    }
                    break;
                }

                Thread.Sleep( 6000 );
                processManager.UpdateViewData();
            }

            return exitCode;
        }