1

我正在尝试在 Windows 7 64 位中使用 CreateService API 安装服务。当调用 CreateService API 时,它会失败并显示错误代码 1314,即“客户端未持有所需的权限。”。

我在管理员模式下运行 Visual Studio。知道为什么在管理员模式下运行的进程创建服务时它仍然失败。

此外,我正在尝试使用 ACCESS_SYSTEM_SECURITY 作为所需的访问标志之一创建服务。仅当 ACCESS_SYSTEM_SECURITY 被传递时,CreateService 才会失败,否则它工作正常。

这是代码

    LUID luidSecurityPriv;
    HANDLE hTokenProcCur;
  if (OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS | TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenProcCur))
        {

    if (LookupPrivilegeValue(NULL, L"SeSecurityPrivilege", &luidSecurityPriv))
    {
        TOKEN_PRIVILEGES tp;
        DWORD cbSinglePriv= sizeof(TOKEN_PRIVILEGES);
        tp.PrivilegeCount= 1;
        tp.Privileges[0].Luid= luidSecurityPriv;
        tp.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED;
        if (AdjustTokenPrivileges(hTokenProcCur,
                                  FALSE,
                                  &tp,
                                  cbSinglePriv,
                                  NULL,
                                  NULL))
        {
            // actually register the NanoService with the OS here
            SC_HANDLE schService = CreateService(schSCManager,                  
                                                 _T(SERVICE_NAME),      
                                                 (LPCTSTR)strServiceName,               
                                                 SERVICE_QUERY_STATUS | SERVICE_CHANGE_CONFIG | SERVICE_START | READ_CONTROL | WRITE_DAC | ACCESS_SYSTEM_SECURITY,      // desired access
                                                 SERVICE_WIN32_OWN_PROCESS,     // service type
                                                 SERVICE_AUTO_START,                // start type
                                                 SERVICE_ERROR_NORMAL,          // error control type
                                                 strServicePath,                            // service's binary
                                                 NULL,                          // no load ordering group
                                                 NULL,                          // no tag identifier
                                                 NULL,                          // dependencies
                                                 NULL,                          // LocalSystem account
                                                 NULL);                         // no password

            if (schService)
            {
                MessageBox(NULL,"CreateService Succeeded",L"",MB_OK);
            }
            else
                MessageBox(NULL,"CreateService failed",L"",MB_OK);
        }
    }   
    }
4

1 回答 1

1

的描述说明ACCESS_SYSTEM_SECURITY了此访问权限的要求:

获得此访问权限的正确方法是在调用者的当前访问令牌中启用 SE_SECURITY_NAME 权限,打开 ACCESS_SYSTEM_SECURITY 访问的句柄,然后禁用该权限。

于 2013-11-05T18:39:04.487 回答