Проекты установщика - запуск настраиваемого действия с повышенными привилегиями - PullRequest
0 голосов
/ 05 мая 2019

У меня есть приложение Visual Studio 2017 c # с приложением установщика проектов установщика. Мы используем «настраиваемое действие» для запуска исполняемого файла, который запускается по завершении MSI, а настраиваемое действие находится на вкладке «принятие» на вкладке настраиваемых действий.

Когда приложение запускается, его основной пользователь Windows - NT AUTHORITY \ SYSTEM.

Когда я запускаю приложение самостоятельно, его пользователь - я, MYDOMAIN \ MYUSER

Так что я пытаюсь получить его, чтобы повысить эти разрешения, и поэтому, не прибегая к поиску в основном по старым вопросам stackoverflow, я нашел три возможных решения, но ни одно из них не помогло мне, во всех случаях exe все еще работал под NT AUTHORITY \ СИСТЕМА

  1. Добавить манифест приложения, содержащий
<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
  1. Отредактируйте файл vdproj в блокноте, чтобы сделать RequalElevation "true"
    "MsiBootstrapper"
    {
        "LangId" = "3:1033"
        "RequiresElevation" = "11:TRUE"
    }
  1. Попытка добавления AdminUser в качестве условия запуска, согласно: Как избежать UAC, когда имя моего EXE-файла содержит слово "update"?

Выше были опробованы все вместе и по отдельности, но всегда остается пользователем SYSTEM.

Есть какие-нибудь идеи о том, как заставить настраиваемое действие запускаться как привилегии зарегистрированного пользователя, а не как СИСТЕМА? спасибо

1 Ответ

0 голосов
/ 07 мая 2019

Ответ EASY оказался приемлемым ответом в этой теме:

Установщик Windows, использующий NT AUTHORITY \ SYSTEM вместо имени пользователя

[quote]

Короткий ответ: вы не можете сделать это в настройке Visual Studio, которая является установкой InstallAllUsers, поскольку все установщики VS сгенерировали настраиваемые действия, выполняемые от имени системной учетной записи.Поэтому вам нужно изменить настройки пользовательских действий в файле MSI с помощью инструмента редактирования, такого как Orca.Вы найдете пользовательское действие в таблице CustomAction в файле MSI, посмотрите значения типа (вероятно, это тип 3074), а затем отключите бит msidbCustomActionTypeNoImpersonate, чтобы он выполнялся под именем пользователя-установщика.

https://msdn.microsoft.com/en-us/library/windows/desktop/aa368069(v=vs.85).aspx

Обратите внимание на то, что запуск под именем пользователя-установщика имеет свой собственный набор проблем, поскольку он НЕ совпадает с выполнением интерактивного пользователя.Профиль пользователя не загружен, поэтому объекты, связанные с пользователем (такие как HKCU, папки профиля пользователя), очень ненадежны.

Многие люди заполняют базы данных отдельными программами при первом запуске приложения, так чтоон работает как интерактивный пользователь и может быть разработан и отлажен как отдельная программа.Если во время установки происходит сбой заполнения, вы либо прекращаете установку и откатываетесь, либо продолжаете установку и получаете пустую базу данных, для которой вам может понадобиться программа для ее заполнения.[/ quote]

НЕ ТАК ЛЕГКИЙ ОТВЕТ , но отличным решением было следующее:

Отредактируйте файл MSI, удалив тип msidbCustomActionTypeNoImpersonate из записи настраиваемого действия.

Я сделал это программно в программе VB.NET следующим образом:

    Dim o As WindowsInstaller.Installer = CType(CreateObject("WindowsInstaller.Installer"), WindowsInstaller.Installer)

    Dim db As WindowsInstaller.Database
    db = o.OpenDatabase(fil.FullName, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeDirect)

    Dim record As WindowsInstaller.Record = Nothing
    view = db.OpenView("select File.File, FileName From File")
    view.Execute(record)
    record = view.Fetch
    Dim bFound As Boolean = False
    While record IsNot Nothing
        Dim sFileName As String = record.StringData(2)
        If sFileName.EndsWith("MYCUSTOMACTIONEXE.exe", StringComparison.CurrentCultureIgnoreCase) = True Then
            bFound = True
            Exit While
        End If
        record = view.Fetch
    End While

    If bFound = True Then
        Dim sGUID As String = record.StringData(1)

        '   At time of writing this was changing a 3602 into a 1554, so removing msidbCustomActionTypeNoImpersonate 
        '   The record key was _65BF5279_D2EA_42C1_AC66_90A684817EE5 which is the custom action for MYCUSTOMACTIONEXE.exe


        view = db.OpenView("select Action, Type From CustomAction Where Source = '" & sGUID & "'")
        view.Execute(record)
        record = view.Fetch
        If record IsNot Nothing Then
            Dim sActionGUID As String = record.StringData(1)
            Dim sType As String = record.StringData(2)
            If sActionGUID IsNot Nothing AndAlso sActionGUID <> "" Then
                '   Take off Hex 800 which means noimpersonation
                Dim lType As Integer = CInt(sType)
                If lType And 2048 = 2048 Then
                    Dim sNewType As String = CStr(lType - 2048)
                    Dim v As WindowsInstaller.View = db.OpenView(
                        "update CustomAction set Type=" & sNewType & " Where CustomAction.Action = '" & sActionGUID & "'")
                    v.Execute()
                End If
            End If

        End If
    End If
...