我在win7下。我有一个进程是system权限运行的进程。进程中会createprocess一个进程。然后我需要这个进程调出来的时候不是system进程而是user的权限。我在createprocess的时候把进程的继承属性设置为了FALSE但是还是调出来是USER的权限。改怎么来弄呢。谢谢

解决方案 »

  1.   

    详细点啊哥哥。那个只能提升权限吧。可以降低权限吗?  user权限是哪个参数啊?
      

  2.   

    获取当前Explorer.exe的token,然后CreateProcessAsUser的方式模拟当前资源管理器的session,这样就可以启动当前User权限的进程了...
      

  3.   

    http://blog.csdn.net/sdpdww/archive/2008/12/16/3531227.aspx
      

  4.   

    这个我弄提升为 system权限的时候炒过一段。现在我要降低为 user 的权限怎么写啊。能把关键的代码写两句吗?万分感谢
      

  5.   

    CHandle processToken;
    VERIFY(::OpenProcessToken(::GetCurrentProcess(),
                              TOKEN_DUPLICATE,
                              &processToken.m_h));
    CHandle duplicateToken;
    VERIFY(::DuplicateTokenEx(processToken,
                              MAXIMUM_ALLOWED,
                              0, // token attributes
                              SecurityAnonymous,
                              TokenPrimary,
                              &duplicateToken.m_h));
    WellKnownSid integrityLevelSid(WellKnownSid::MandatoryLabelAuthority,
                                   SECURITY_MANDATORY_LOW_RID);
    TOKEN_MANDATORY_LABEL tokenIntegrityLevel = { 0 };
    tokenIntegrityLevel.Label.Attributes = SE_GROUP_INTEGRITY;
    tokenIntegrityLevel.Label.Sid = &integrityLevelSid;
    VERIFY(::SetTokenInformation(duplicateToken,
                                 TokenIntegrityLevel,
                                 &tokenIntegrityLevel,
                                 sizeof (TOKEN_MANDATORY_LABEL) + ::GetLengthSid(&integrityLevelSid)));
    STARTUPINFO startupInfo = { sizeof (STARTUPINFO) };
    ProcessInfo processInfo;
    VERIFY(::CreateProcessAsUser(duplicateToken,
                                 L"C:\\Windows\\Notepad.exe",
                                 0, // cmd line
                                 0, // process attributes
                                 0, // thread attributes
                                 FALSE, // don't inherit handles
                                 0, // flags
                                 0, // inherit environment
                                 0, // inherit current directory
                                 &startupInfo,
                                 &processInfo));用了这段代码还是 system 我就郁闷了。
      

  6.   

    弄个User的SID给它不就行了。
    你升会了,降不是一样的么?SID不同而已啊
      

  7.   

    我上面的代码不就是用的 SID的吗?没用啊。你写点出来参考参考呢
      

  8.   

    VERIFY(::OpenProcessToken(::GetCurrentProcess(),//这里就不对了,你得到的是当前进程的Token,你要得到一个User权限进程的Token,比如Explorer.exe
      TOKEN_DUPLICATE,
      &processToken.m_h));
    CHandle duplicateToken;
    VERIFY(::DuplicateTokenEx(processToken,
      MAXIMUM_ALLOWED,
      0, // token attributes
      SecurityAnonymous,
      TokenPrimary,
      &duplicateToken.m_h));
      

  9.   

    不好意思。该成了Explorer.exe还是一样。我是没理解啊。都说了是抄的啊。你说说原理呢。为什么要这样。我的是主进程是服务加载起来的具有system权限
      

  10.   

    用ATL的CAccessToken类
    然后调用如下成员函数
    CAccessToken::CreateProcessAsUser