gpt4 book ai didi

c++ - 以提升的权限运行时如何正确检测网络驱动器

转载 作者:可可西里 更新时间:2023-11-01 09:57:47 27 4
gpt4 key购买 nike

我正在开发一个需要在 Windows 上正确检测所有已用驱动器盘符的应用程序。为此,我使用了 GetLogicalDrives() 函数。此功能工作正常,除非用户以提升的权限启动我的应用程序(即,使用属于“管理员”组的帐户登录的用户并通过选择“以管理员身份运行”选项启动我的应用程序)。在这种情况下,GetLogicalDrives() 无法检测到机器上映射的网络驱动器。

问题的根本原因似乎是在这种情况下 Windows 并行运行 2 个用户 session 。我的应用程序在“提升权限” session 中运行,而驱动器映射在“非提升” session 中:

https://support.microsoft.com/en-us/help/3035277/mapped-drives-are-not-available-from-an-elevated-prompt-when-uac-is-configured-to-prompt-for-credentials-in-windows

这个问题是否有任何编程解决方法?我试图在“非提升” session 中重新启动我的应用程序,但不知道如何(或者是否可能)。我已经尝试过的是使用受限 token 重新启动我的应用程序(使用 CreateRestrictedTokenDISABLE_MAX_PRIVILEGE 选项),希望 Windows 会以某种方式弄清楚它现在可以重新启动我的应用程序“非提升” session ,但它没有用。

最佳答案

为此,您可以临时模拟链接 token - 所以获取自己的链接 token ,如果存在,将其设置为线程,调用 GetLogicalDrives() 并返回到进程 token (链接 token 有 SECURITY_IMPERSONATION_LEVEL == SecurityIdentification 结果它可以被非常限制地使用 )

#define BOOL_TO_ERR(b) ((b) ? NOERROR : GetLastError())

ULONG GetLogicalDrivesEx(PULONG pDrives)
{
HANDLE hToken;

ULONG err = BOOL_TO_ERR(OpenProcessToken(NtCurrentProcess(), TOKEN_QUERY, &hToken));

if (err != NOERROR)
{
return err;
}

union {
TOKEN_ELEVATION_TYPE tet;
TOKEN_LINKED_TOKEN tlt;
};

ULONG rcb;

err = BOOL_TO_ERR(GetTokenInformation(hToken, TokenElevationType, &tet, sizeof(tet), &rcb));

if (err == NOERROR)
{
if (tet == TokenElevationTypeFull)
{
err = BOOL_TO_ERR(GetTokenInformation(hToken, TokenLinkedToken, &tlt, sizeof(tlt), &rcb));

if (err == NOERROR)
{
if (NOERROR == (err = BOOL_TO_ERR(SetThreadToken(0, tlt.LinkedToken))))
{
err = (rcb = GetLogicalDrives()) ? NOERROR : GetLastError();
SetThreadToken(0, 0);
}

CloseHandle(tlt.LinkedToken);
}
}
else
{
err = (rcb = GetLogicalDrives()) ? NOERROR : GetLastError();
}
}

*pDrives = rcb;
return err;
}

void test()
{
ULONG Drives, Drives0 = GetLogicalDrives();
GetLogicalDrivesEx(&Drives);
WCHAR sz[32];
swprintf(sz, L"%08x %08x", Drives0, Drives);
MessageBoxW(0, sz, L"", MB_OK);

}

如果没有错误(GetLogicalDrivesEx 返回 NOERROR)Drives 是未提升 session 的逻辑驱动器,当 Drives0 - 提升时(如果当然你跑得高)

关于c++ - 以提升的权限运行时如何正确检测网络驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com