访问被拒绝 - 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.