Пакетный запуск от имени администратора всех пользователей

Я работаю над автоматической установкой SQL 2008, 2012 и 2014, которая до сих пор работает с моей пакетной командой. Одна проблема, с которой я сталкиваюсь, заключается в том, что для правильного использования основной функции, которая есть в каждой программе (студии управления) в Windows 10, она должна запускаться от имени администратора.

В Windows 10 это можно сделать вручную, открыв расположение файла ярлыка программы - щелчок правой кнопкой мыши - свойства - вкладка "Совместимость" - "изменить настройки для всех пользователей" - установите флажок "запускать эту программу от имени администратора". Есть ли способ, чтобы пакетная команда проверила это поле? Таким образом, персоналу не нужно будет каждый раз запускать его вручную как администратор, он просто автоматически откроет Management Studio как администратор.

Моя пакетная команда может быть найдена ниже для автоматизации установки. В начале находит установочные файлы, устанавливает пароль sa на все, что я хочу, и извлекает пользовательские настройки для установщика SQL из файла configurationfile.ini. Мне нужно "запускать как администратор", чтобы все пользователи запускались после всего этого.

start "" "%~dp0SQL2008\setup.exe" /SAPWD="XXXXXXXX" /ConfigurationFile="ConfigurationFile.ini" /quiet

1 ответ

Решение
@echo off
setlocal

call :reg_compat "C:\User\Test\test.exe" "WINXPSP3 RUNASADMIN"
if errorlevel 1 echo Registry write failed.

exit /b

:reg_compat  fullpath, reg_data
setlocal
set "reg_key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
set "reg_data="

:: Get current registry data.
for /f "tokens=1,2*" %%A in ('2^>nul reg query "%reg_key%" /v "%~1"') do (
    if /i "%%~A" == "%~1" set "reg_data=%%~C"
)

:: Write new entry and exit.
if not defined reg_data (
    >nul reg add "%reg_key%" /v "%~1" /d "%~2" /f
    if errorlevel 1 exit /b 1
    exit /b 0
)

:: Copy original registry data.
set "reg_data_original=%reg_data%"

:: Append new data if not in original registry data.
for %%A in (%~2) do (
    set "value_exist="

    for %%B in (%reg_data_original%) do (
        if "%%~A" == "%%~B" set "value_exist=1"
    )

    if not defined value_exist (
        call set "reg_data=%%reg_data%% %%~A"
    )
)

:: Continue only if registry data is modified.
if "%reg_data_original%" == "%reg_data%" exit /b 0

:: Write modified entry and exit.
>nul reg add "%reg_key%" /v "%~1" /d "%reg_data%" /f
if errorlevel 1 exit /b 2
exit /b 0

Код установлен для записи тестовой записи. Тестовая запись добавит совместимость с Windows XP SP3 и Run As Admin для этого пути к файлу.

Для фактического использования измените аргументы для вызова метки :reg_compat с полным путем к файлу в качестве 1-го аргумента и аргументов совместимости reg_data в качестве 2-го аргумента. Аргументы совместимости указаны в верхнем регистре и разделены пробелом.

Этикетка :reg_compat будет писать новые записи или обновлять записи с добавлением новых аргументов совместимости. errorlevel из вызываемой метки устанавливается не 0, если reg add выходит из строя.

Минимальный код вместо этого, если вам нужно только это:

@echo off
setlocal

set "reg_key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
reg add "%reg_key%" /v "C:\User\Test\test.exe" /d "WINXPSP3 RUNASADMIN" /f
Другие вопросы по тегам