2

我有这个代码:

    [PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public List<WinInfo> GetWindows()
    {
        try
        {
            var isFullTrust = Assembly.GetExecutingAssembly().IsFullyTrusted;
            if (isFullTrust)
            {
                return Process.GetProcesses().Where(z => !string.IsNullOrEmpty(z.MainWindowTitle))
                    .Select(z => new WinInfo
                        {
                            ProcessID = z.Id,
                            ProcessName = z.ProcessName,
                            WinID = z.MainWindowHandle,
                            WindowTitle = z.MainWindowTitle
                        }).ToList();
            }
            else
                return null;
        }
        catch (Exception ex)
        {
            Trace.Write(ex.Message);
            return null;
        }
    }

当我在当前用户(具有管理员权限)下在本地计算机上进行测试时,它可以正常工作,显示所有具有窗口的进程。但是当我从 Windows 服务调用此代码时,在“本地服务”帐户下运行时,列表为空。我附加到该进程,并通过调试发现“Process.GetProcesses()”返回所有进程,但所有进程的 MainWindowHandle 为 0,MainWindowTitle 为空,即使它们确实有窗口。那么我的代码有什么问题?

编辑我编辑了代码,以便它检查程序集是否完全信任并具有 PemmissionSet 应该授予代码必要的权限。结果还是一样。当我调试时,我可以看到,“isFullTrust”是“True”并且代码执行时没有异常。列表仍然是空的,因为没有进程包含非空 MainWindowTitle

4

3 回答 3

1

当然,您需要在用户帐户下运行它!为什么打开窗口的应用程序会在本地系统帐户下运行?那是用于Windows服务等

它也可能与您需要完全信任的流程有关

来自 MSDN: Process 类上有一个 LinkDemand 和一个 InheritenceDemand for FullTrust 。这意味着如果您的程序集不完全受信任,它将无法启动新进程或获取有关正在运行的进程的信息

于 2012-07-16T13:10:26.760 回答
0

也许这是一个特权问题。根据链接 LocalService在本地计算机上具有最低权限。

你应该使用本地系统帐户

于 2012-07-16T12:41:10.557 回答
0

根据这个线程:

您看到的问题是因为默认情况下服务无权访问任何交互式桌面。我不建议从服务与桌面交互(#1,可能没有任何桌面,#2 可能有多个桌面,#3 在 Vista 中从服务与桌面交互未实现)但是,您可以检查服务属性中的“与桌面交互”。

也许您可以尝试创建一个隐藏的表单?

于 2012-07-17T06:01:48.037 回答