Winapi 为什么这些特权在这里不起作用?

Winapi 为什么这些特权在这里不起作用?,winapi,Winapi,我只想编写一个小应用程序,用Windows刷新文件系统缓存: #include <Windows.h> #include <iostream> #include <cstddef> using namespace std; DWORD SetPrivilege( HANDLE hToken, LPCWSTR lpszPrivilege, bool enablePrivilege ); int wmain( int argc, wchar_t **argv

我只想编写一个小应用程序,用Windows刷新文件系统缓存:

#include <Windows.h>
#include <iostream>
#include <cstddef>

using namespace std;

DWORD SetPrivilege( HANDLE hToken, LPCWSTR lpszPrivilege, bool enablePrivilege );

int wmain( int argc, wchar_t **argv )
{
    if( argc >= 4 )
    {
        HANDLE hUserToken;
        if( !LogonUserW( argv[1], argv[2], argv[3], LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hUserToken ) )
            return (cout << "wrong credentialds" << endl), EXIT_FAILURE;
        if( !ImpersonateLoggedOnUser( hUserToken ) )
            return (cout << "wrong can't impersonate user" << endl), EXIT_FAILURE;
        if( SetPrivilege( hUserToken, L"SeIncreaseQuotaPrivilege", true ) != NO_ERROR )
            return (cout << "can't assign privolege" << endl), EXIT_FAILURE;
    }
    if( !SetSystemFileCacheSize( -1, -1, 0 ) )
        return (cout << "flushing failed " << GetLastError() << endl), EXIT_FAILURE;
}

DWORD SetPrivilege( HANDLE hToken, LPCWSTR lpszPrivilege, bool enablePrivilege )
{
    TOKEN_PRIVILEGES tp;
    LUID             privilegeLuid;
    if( !LookupPrivilegeValueW( nullptr, lpszPrivilege, &privilegeLuid ) )
        return GetLastError();
    tp.PrivilegeCount           = 1;
    tp.Privileges[0].Luid       = privilegeLuid;
    tp.Privileges[0].Attributes = enablePrivilege ? SE_PRIVILEGE_ENABLED : 0;
    if( !AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof tp, nullptr, nullptr ) )
        return GetLastError();
    if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
        return ERROR_NOT_ALL_ASSIGNED;
    return NO_ERROR;
}
#包括
#包括
#包括
使用名称空间std;
DWORD SetPrivilege(HANDLE-hToken、LPCWSTR-lpszPrivilege、bool-enablePrivilege);
内部wmain(内部argc,wchar\u t**argv)
{
如果(argc>=4)
{
手握葫芦;
if(!LogonUserW(argv[1]、argv[2]、argv[3]、LOGON32\u LOGON\u INTERACTIVE、LOGON32\u PROVIDER\u DEFAULT和hUserToken))

return(不能让您使用提升的令牌而不是管理员身份运行程序?(将清单更改为要求提升才能尝试)hUserToken根本没有SeIncreaseQuotaPrivilege,因为结果AdjustTokenPrivileges失败。AdjustTokenPrivileges没有向令牌添加权限。令牌权限中存在此api on或off。作为旁注-ImpersonalLoggeDonUser后调用SetPrivilege对线程令牌没有影响。并且您没有关闭hUserToken@SoronelHaetir-在代码中使用tok从LogonUserW,但不是从当前进程。您不能授予自己尚未拥有的特权。正如RbMm所说,
hUserToken
没有
SeIncreaseQuotaPrivilege
。您需要使用具有此特权的令牌来启用它。