Не работает с повышенными правами, хотя приглашение UAC принято (настраиваемое действие) - PullRequest
1 голос
/ 03 декабря 2010

Я собрал установщик с помощью wix, включающего настраиваемые действия, для которых требуются права администратора.

В настоящий момент этот установщик работает только тогда, когда он выполняется учетной записью администратора встроенной системы. В этом случае приглашение UAC не отображается.
Если установщик выполняется любым другим членом локальной группы администраторов, отображается приглашение UAC. Хотя я разрешаю вносить изменения в мой компьютер, функции windows api в моих пользовательских действиях возвращают ошибки, такие как «пропущенные привилегии», ...

Я пытался разрешить выполнение пользовательских действий отложено, но это не помогло.

У меня заканчиваются идеи, поэтому ваша помощь будет очень кстати.

С уважением Ralf

Ответы [ 3 ]

1 голос
/ 03 декабря 2010

Насколько я знаю, скрипт установки выполняется учетной записью LocalSystem. Как кажется (смотрите http://msdn.microsoft.com/en-us/library/ms684190), в этой учетной записи отключено несколько привилегий. Например, SE_BACKUP_NAME отключено, и это необходимо для вызова LoadUserProfile.

Я уже экспериментировал с API-функцией AdjustTokenPrivileges, но безуспешно. У учетной записи LocalSystem есть TOKEN_ADJUST_PRIVILEGES? Я не знаю связанных привилегий SE_XXXXXX_NAME.

С уважением Ralf

1 голос
/ 05 декабря 2010

Решение, которое я обнаружил, заключалось в том, что я объединил свой установщик с загрузчиком, который запросит UAC, если у пользователя нет соответствующих прав.

Если вы не хотите использовать этот подход, этот код может вам помочь.

public static ActionResult CheckPrivileges (сеанс сеанса) {

        bool isadmin = false;

        System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
        System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi);

        if (wp.IsInRole("Administrators"))
            isadmin = true;
        else
            isadmin = false;

        if (isadmin)
        {
            return ActionResult.Success;
        }
        else
        {
            if (System.Environment.OSVersion.Version.Major >= 6) // Windows Vista or higher
                MessageBox.Show("Administrator priveleges are required to install the application. Please right click the setup file and select 'Run as administrator'.", "Mesaage", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
                MessageBox.Show("Administrator priveleges are required to install the application.", "Mesaage", MessageBoxButtons.OK, MessageBoxIcon.Error);

            return ActionResult.Failure;
        }
    }
1 голос
/ 03 декабря 2010

Попробуйте выполнить пользовательские действия с флагом msidbCustomActionTypeNoImpersonate (установите для параметра Impersonate значение "no"): http://msdn.microsoft.com/en-us/library/aa368069(VS.85).aspx

Таким образом, он будет работать под локальной системной учетной записью с полными привилегиями. Обратите внимание, что ваши действия должны быть отложены для использования этого флага.

...