jjzjj

c++ - OpenProcessToken 因本地系统服务的 ERROR_ACCESS_DENIED 而失败

coder 2024-06-11 原文

先说说我的情况。我在下面描述的问题来自最终用户的机器,我所要做的只是一份 Windows 事件日志的拷贝。我无法访问机器本身来运行任何调试测试。

现在是问题。我有一个这样创建的服务应用程序:

SC_HANDLE hScService = CreateService(hScManager, 
    L"MyServiceID", 
    L"My Service Name",
    SERVICE_ALL_ACCESS, 
    SERVICE_WIN32_OWN_PROCESS, 
    SERVICE_AUTO_START, 
    SERVICE_ERROR_NORMAL,
    SrvcPath,
    NULL, NULL, NULL, NULL, _T(""));

服务进程后面有它的SE_DEBUG_NAME使用 AdjustTokenPrivileges 设置权限API。

后来我有一个方法可以枚举正在运行的进程,然后使用这样的代码获取进程 LUID:

//'pProcIDs' = list of process IDs obtained from EnumProcesses()

for(UINT i = 0; i < nNumProc; i++)
{
    DWORD dwProcID = pProcIDs[i];

    //Skip obvious system processes
    if(dwProcID != 0 &&
        dwProcID != 4)
    {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcID);
        if(hProcess)
        {
            HANDLE hTokenHandle;
            if(::OpenProcessToken(hProcess, TOKEN_QUERY, &hTokenHandle))
            {
                TOKEN_STATISTICS ts;
                DWORD dwcbSz = 0;
                if(::GetTokenInformation(hTokenHandle, TokenStatistics, &ts, sizeof(ts), &dwcbSz))
                {
                    //And so on...
                }
                else
                {
                    //Handle error here
                }

                ::CloseHandle(hTokenHandle);
            }
            else
            {
                //***Here's where I get my error in question***
            }

            ::CloseHandle(hProcess);
        }
        else
        {
            //Handle error here
        }
    }
}

当我在自己的开发计算机上运行上面的代码时,它运行得很好。 请注意,这些计算机运行的是操作系统的“库存”拷贝,没有安装任何 AVP 或其他第三方软件。

我从运行 Windows 7 Professional 机器(它是 Active Directory 域的成员)的客户那里收到的事件日志拷贝有 3 个进程返回 ERROR_ACCESS_DENIED当我调用 OpenProcessToken从上面的代码中获取它们。它们的 PID 只是常规值,例如 1824、2760、5024(重启后显然会发生变化。)

有人知道为什么会这样吗?我需要为我的服务设置额外的权限吗?

附言。从事件日志中我可以看出有问题的工作站有一些 Symantec Antivirus已安装产品,根据这一行判断:

New virus definition file loaded. Version: 140217066.

最佳答案

赛门铁克防病毒软件(以及许多其他安全软件供应商的软件)可能会尝试防止未经授权的行为者篡改其进程。为其其中一个进程获取进程 token 可能符合条件。

也就是说,您可以通过检查支持进程的可执行镜像的路径,快速验证有问题的 PID 实际上是 Symantec 程序包的一部分。如果它们是 Symantec AV 软件包的一部分,您将需要考虑将其配置为信任您的应用程序,或者在运行此代码时将其禁用(不推荐),或者干脆忽略此类错误。

关于c++ - OpenProcessToken 因本地系统服务的 ERROR_ACCESS_DENIED 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21893404/

有关c++ - OpenProcessToken 因本地系统服务的 ERROR_ACCESS_DENIED 而失败的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - Ruby on Rails : . 常量化 : wrong constant name error? - 2

    我正在使用这个:4.times{|i|assert_not_equal("content#{i+2}".constantize,object.first_content)}我之前声明过局部变量content1content2content3content4content5我得到的错误NameError:wrongconstantnamecontent2这个错误是什么意思?我很确定我想要content2=\ 最佳答案 你必须用一个大字母来调用ruby​​常量:Content2而不是content2。Aconstantnamestart

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  6. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  7. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  8. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  9. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  10. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

随机推荐