在 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的主要内容,如果未能解决你的问题,请参考以下文章