访问被拒绝 - UWP 完全信任进程
Access is denied - UWP full trust process
我有一个 UWP C++/WinRT 应用程序和一个 C++/WinRT 控制台应用程序。
UWP 应用程序使用 FullTrustProcessLauncher
启动控制台应用程序,控制台应用程序应该在系统上启动任意 .exe
文件,例如cmd.exe
.
控制台应用程序的全部代码在这里:
#include "pch.h"
#include <iostream>
int main()
{
winrt::init_apartment();
try
{
winrt::Windows::System::ProcessLauncher::RunToCompletionAsync(L"cmd.exe", L"").get();
}
catch (const winrt::hresult_error& err)
{
std::cout << winrt::to_string(err.message()) << std::endl;
}
std::cin.get();
}
和pch.h
包括winrt/Windows.Foundation
以及winrt/Windows.System.h
。
UWP 应用程序可以成功启动控制台应用程序,但是控制台应用程序似乎无法启动.exe
文件 , E_ACCESSDENIED
.
我是否认为控制台应用程序应该能够启动任意 .exe
文件作为完全信任的进程?
如果没有,我该如何修复 Access is denied
错误?
并非所有 Windows 运行时 API 在 Win32 上下文中都受支持
'classic' 桌面应用程序,因为它们仅适用于通用 Windows 平台 (UWP) 的“AppContainer”上下文。
对于 Win32 桌面应用程序,最好的解决方案是使用 ShellExecuteEx
。如果需要,此函数会处理用户帐户控制 (UAC) 提升,因为如果调用者和目标不相同,CreateProcess
将失败。
// Get working directory from executable path.
wchar_t szDirectory[MAX_PATH] = {};
wcscpy_s( szDirectory, szExePath );
PathRemoveFileSpec( szDirectory );
SHELLEXECUTEINFOW info = {};
info.cbSize = sizeof( info );
info.lpVerb = L"open";
info.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC | SEE_MASK_NOCLOSEPROCESS;
info.lpFile = szExePath;
info.lpParameters = szExeArgs;
info.lpDirectory = szDirectory;
info.nShow = SW_SHOW;
if( !ShellExecuteExW( &info ) )
// Error
此时您检查 info.hProcess
句柄上的等待或只是检查目标程序是否已完成。
如果您需要退出代码,请使用:
DWORD exitCode;
GetExitCodeProcess( info.hProcess, &exitCode );
确保不要通过调用 CloseHandle( info.hProcess );
泄露句柄。如果您不关心等待或退出代码,就不要使用 SEE_MASK_NOCLOSEPROCESS
。如果您希望它完全异步,请不要使用 SEE_MASK_NOASYNC
.
我有一个 UWP C++/WinRT 应用程序和一个 C++/WinRT 控制台应用程序。
UWP 应用程序使用 FullTrustProcessLauncher
启动控制台应用程序,控制台应用程序应该在系统上启动任意 .exe
文件,例如cmd.exe
.
控制台应用程序的全部代码在这里:
#include "pch.h"
#include <iostream>
int main()
{
winrt::init_apartment();
try
{
winrt::Windows::System::ProcessLauncher::RunToCompletionAsync(L"cmd.exe", L"").get();
}
catch (const winrt::hresult_error& err)
{
std::cout << winrt::to_string(err.message()) << std::endl;
}
std::cin.get();
}
和pch.h
包括winrt/Windows.Foundation
以及winrt/Windows.System.h
。
UWP 应用程序可以成功启动控制台应用程序,但是控制台应用程序似乎无法启动.exe
文件 , E_ACCESSDENIED
.
我是否认为控制台应用程序应该能够启动任意 .exe
文件作为完全信任的进程?
如果没有,我该如何修复 Access is denied
错误?
并非所有 Windows 运行时 API 在 Win32 上下文中都受支持 'classic' 桌面应用程序,因为它们仅适用于通用 Windows 平台 (UWP) 的“AppContainer”上下文。
对于 Win32 桌面应用程序,最好的解决方案是使用 ShellExecuteEx
。如果需要,此函数会处理用户帐户控制 (UAC) 提升,因为如果调用者和目标不相同,CreateProcess
将失败。
// Get working directory from executable path.
wchar_t szDirectory[MAX_PATH] = {};
wcscpy_s( szDirectory, szExePath );
PathRemoveFileSpec( szDirectory );
SHELLEXECUTEINFOW info = {};
info.cbSize = sizeof( info );
info.lpVerb = L"open";
info.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC | SEE_MASK_NOCLOSEPROCESS;
info.lpFile = szExePath;
info.lpParameters = szExeArgs;
info.lpDirectory = szDirectory;
info.nShow = SW_SHOW;
if( !ShellExecuteExW( &info ) )
// Error
此时您检查 info.hProcess
句柄上的等待或只是检查目标程序是否已完成。
如果您需要退出代码,请使用:
DWORD exitCode;
GetExitCodeProcess( info.hProcess, &exitCode );
确保不要通过调用 CloseHandle( info.hProcess );
泄露句柄。如果您不关心等待或退出代码,就不要使用 SEE_MASK_NOCLOSEPROCESS
。如果您希望它完全异步,请不要使用 SEE_MASK_NOASYNC
.