我有这个代码:
[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 为空,即使它们确实有窗口。那么我的代码有什么问题吗?
Edit我编辑了代码,以便它检查程序集是否完全信任,并具有应授予代码必要权限的 PemmissionSet。结果还是一样。当我调试时,我可以看到“isFullTrust”为“True”并且代码执行时没有异常。列表仍然是空的,因为没有一个进程包含非空的 MainWindowTitle
根据this http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/989405f4-ad8d-49cf-a0ef-6d92aa353e0d线 :
您看到的问题是因为默认情况下服务无法访问任何交互式桌面。我不建议从服务与桌面交互(#1,可能没有任何桌面,#2 可能有多个桌面,#3 Vista 中未实现从服务与桌面交互),但是,您可以检查服务属性中的“与桌面交互”。
也许你可以尝试创建一个隐藏表单?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)