c# - google - asp.net mvc+oauth



Как проверить, выполняется ли еще одна установка? (2)

См. Описание Mutex _MSIExecute в MSDN.

https://src-bin.com

Предполагая, что я пытаюсь автоматизировать установку чего-либо в Windows, и я хочу попытаться проверить, выполняется ли еще одна установка, прежде чем пытаться установить. У меня нет контроля над установщиком, и я должен сделать это в рамках автоматизации. Есть ли лучший способ сделать это, некоторые win32 api ?, чем просто тестирование, если msiexec работает?

[Обновление 2]

Улучшенный предыдущий код, который я использовал для прямого доступа к мьютексам, намного надежнее:

using System.Threading;

[...]

/// <summary>
/// Wait (up to a timeout) for the MSI installer service to become free.
/// </summary>
/// <returns>
/// Returns true for a successful wait, when the installer service has become free.
/// Returns false when waiting for the installer service has exceeded the timeout.
/// </returns>
public static bool WaitForInstallerServiceToBeFree(TimeSpan maxWaitTime)
{
    // The _MSIExecute mutex is used by the MSI installer service to serialize installations
    // and prevent multiple MSI based installations happening at the same time.
    // For more info: http://msdn.microsoft.com/en-us/library/aa372909(VS.85).aspx
    const string installerServiceMutexName = "Global\\_MSIExecute";

    try
    {
        Mutex MSIExecuteMutex = Mutex.OpenExisting(installerServiceMutexName, 
            System.Security.AccessControl.MutexRights.Synchronize);
        bool waitSuccess = MSIExecuteMutex.WaitOne(maxWaitTime, false);
        MSIExecuteMutex.ReleaseMutex();
        return waitSuccess;
    }
    catch (WaitHandleCannotBeOpenedException)
    {
        // Mutex doesn't exist, do nothing
    }
    catch (ObjectDisposedException)
    {
        // Mutex was disposed between opening it and attempting to wait on it, do nothing
    }
    return true;
}

Answer #1

Извините за угон, вы публикуете!

Я работаю над этим - около недели - используя ваши заметки (спасибо), а с других сайтов - слишком много, чтобы назвать (спасибо всем).

Я наткнулся на информацию, показывающую, что Служба может предоставить достаточную информацию, чтобы определить, действительно ли служба MSIEXEC уже используется. Служба «msiserver» - установщик Windows - и это информация является как state, так и acceptstop.

Следующий код VBScript проверяет это.

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Check = False
Do While Not Check
   WScript.Sleep 3000
   Set colServices = objWMIService.ExecQuery("Select * From Win32_Service Where Name="'msiserver'")
   For Each objService In colServices
      If (objService.Started And Not objService.AcceptStop)  
         WScript.Echo "Another .MSI is running."
      ElseIf ((objService.Started And objService.AcceptStop) Or Not objService.Started) Then
         WScript.Echo "Ready to install an .MSI application."
         Check = True
      End If
   Next
Loop




windows-installer