首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Process.GetProcesses() process.IsElevated在哪里?

Process.GetProcesses() process.IsElevated在哪里?
EN

Stack Overflow用户
提问于 2015-09-10 19:06:22
回答 1查看 1.5K关注 0票数 0

当非管理用户登录时,我希望监视机器上运行的提升进程。

基本上,我想从C#中运行以下编写的代码:

代码语言:javascript
复制
var elevatedWindows = Process.GetProcesses().Where(p => p.IsElevated || p.ChildWindows.Any(cw => cw.IsElevated));

到目前为止,我发现给我提供我想要的信息的唯一东西似乎是.NET System.Diagnostics.Process类中的一个BUG,如下所述:

http://www.codeproject.com/Articles/302856/Bugs-in-System-Diagnostics-Process-Class

如果我正确地理解了这一点,那么本文指出,如果我的程序没有使用提升的权限运行,如果您试图获得一个提升的进程的WIN32或HasExited属性,它将生成一个带有NativeErrorCode等于5的StartTime异常。对于我的问题,我觉得这可能是一个简单的解决办法--尝试从一个非提升的程序中获取StartTimeHasExited,如果它产生了错误,那么它就是一个提升的过程。

问题是,当我手动右键单击记事本并选择“”并使用GetProcessesByName("notepad")时,我似乎无法让它可靠地工作,GetProcessesByName("notepad")错误也不可靠。

更麻烦的是,我无法隔离单个资源管理器Windows。Explorer.exe总是在运行,并且可以被提升,但是即使它在没有提升的情况下运行,您仍然可以手动启动进程,有许多不同的方式,这些方式都不会影响父explorer.exe进程。

因此,我想我需要从生成的进程或它们的子线程中找到WindowHandles,并以某种方式查看窗口是否被提升?

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 08:36:09

不一定明白你所说的“高架窗户”是什么意思。这个过程是提升的,而不是它的窗口。启动一个新的资源管理器视图会产生一个新的进程。

尽管如此,您可以使用Interop来确定进程是否被提升:

代码:

代码语言:javascript
复制
public enum ElevationType
{
    Default = 1,
    Full = 2,
    Limited = 3
}

// Do add some exception handling...etc.
public static ElevationType GetProcessElevationTypeByTokenHandle(IntPtr hTok)
{
    if (hTok.IsNotNull)
    {
        // Get token information struct length
        // See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx for constants
        int ret = 0;
        GetTokenInformation(hTok, TokenInformationClass.TokenElevationType, IntPtr.Zero, 0, ret);
        IntPtr tokenInformation = Marshal.AllocHGlobal(ret);

        // Get token information struct
        // With then TokenElevationType constant, it will returns a TOKEN_ELEVATION_TYPE value
        // See https://msdn.microsoft.com/en-us/library/windows/desktop/bb530718(v=vs.85).aspx
        GetTokenInformation(hTok, TokenInformationClass.TokenElevationType, tokenInformation, ret, null);

        // Get a valid structure
        var value = Marshal.ReadInt32(tokenInformation, 0);
        Marshal.FreeHGlobal(tokenInformation);
        return (ElevationType)value;
    }
    else
    {
        return ElevationType.Default;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32509846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档