在 C++ 中没有提升的语音识别或 msconfig

Posted

技术标签:

【中文标题】在 C++ 中没有提升的语音识别或 msconfig【英文标题】:Speech Recognition or msconfig without elevation in C++ 【发布时间】:2016-02-13 00:15:07 【问题描述】:

我一直在尝试制作一个使用CreateProcess() 在 Windows 8.1 上运行 Windows 语音识别的程序。创建进程后,我收到错误 740(需要提升)。但是,当我以标准用户身份运行语音识别时(通过在 cmd 中调用 C:\Windows\Speech\Common\sapisvr.exe -SpeechUX 或在“轻松访问中心”中打开它),没有提示要求我提升到管理员权限。当我尝试以编程方式创建相同的进程时,为什么它会要求它?有解决方法吗?我需要它为任何标准用户工作。

//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() 我什至无法调用进程本身。

谢谢。

【问题讨论】:

【参考方案1】:

无法从使用CreateProcess() 的非提升进程启动在其清单中标记为“requireAdministrator”的可执行文件。相反,将返回 ERROR_ELEVATION_REQUIRED。必须改用ShellExecute()ShellExecuteEx()runas 动词用于启动需要提升用户权限的程序。在你的情况下,你有权利,但程序没有。 ShellExecute 赋予您更多权利。

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

ShellExecute的文档

【讨论】:

使用ShellExecute 开始语音识别仍然会提示我管理对话框。 事实上,使用第二个参数"runas" 运行ShellExecute 使标准用户需要管理员密码,但使用第二个参数NULL 运行它不需要。 Msconfig 不能以任何方式启动。我想现在没有提示是不可能运行的。

以上是关于在 C++ 中没有提升的语音识别或 msconfig的主要内容,如果未能解决你的问题,请参考以下文章

语音识别技术简介

由于线程冲突 Qt C++,Google 语音识别不起作用

使用百度语音识别(linux c++ SDK)的踩坑

语音识别技术的基本方法

阿里「杀手锏」级语音识别模型来了!推理效率较传统模型提升10倍,已开源...

语音识别作为后台服务