Распознавание речи или msconfig без повышения прав в C++

Я пытался создать программу, которая использует CreateProcess() для запуска распознавания речи Windows в Windows 8.1. При создании процесса я получаю ошибку 740 (требуется повышение). Но когда я запускаю распознавание речи в качестве обычного пользователя (вызывая C:\Windows\Speech\Common\sapisvr.exe -SpeechUX в cmd или открывая его в центре специальных возможностей), не появляется запрос на повышение прав администратора. Почему он запрашивает это, когда я пытаюсь создать тот же процесс программно? Есть ли обходной путь для этого? Мне нужно, чтобы он работал для любого стандартного пользователя.

//This invokes SR without any problem, as well as manually typing into cmd
system("C:\\Windows\\Speech\\Common\\sapisvr.exe -SpeechUX");

//This returns error if not run as admin
TCHAR[] param = TEXT("-SpeechUX");
if (!CreateProcess(TEXT("C:\\Windows\\Speech\\Common\\sapisvr.exe"),
                   param,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
    printf("error creating process %d", GetLastError());
    return 1;
}

То же самое происходит при попытке вызвать msconfig.exe. Я знаю, что msconfig требует больше привилегий, но, насколько я знаю, его должен запускать любой, и он должен запрашивать согласие администратора во время выполнения (при нажатии на одну из его вкладок). Но с помощью CreateProcess() я не могу даже вызвать сам процесс.

Спасибо.


person MiragePV    schedule 13.02.2016    source источник


Ответы (1)


Исполняемый файл, помеченный в манифесте как «requireAdministrator», не может быть запущен из процесса без повышенных прав с помощью CreateProcess(). Вместо этого будет возвращено значение ERROR_ELEVATION_REQUIRED. Вместо этого следует использовать ShellExecute() или ShellExecuteEx(). Глагол runas используется для запуска программ, требующих повышенных прав пользователя. В вашем случае у вас есть права, а у программы нет. ShellExecute дает вам больше прав.

ShellExecute(NULL, "runas", "C:\\Windows\\Speech\\Common\\sapisvr.exe", param, 0, SW_SHOWNORMAL);

Документация по ShellExecute

person Nejc Galof    schedule 13.02.2016
comment
Запуск распознавания речи с помощью ShellExecute по-прежнему предлагает мне диалоговое окно администратора. - person MiragePV; 13.02.2016
comment
На самом деле, при запуске ShellExecute со вторым параметром "runas" обычному пользователю требуется пароль администратора, а при запуске со вторым параметром NULL — нет. Msconfig не может быть запущен в любом случае. Я предполагаю, что теперь невозможно запустить его без подсказки. - person MiragePV; 13.02.2016