如何获取调用D-Bus接口org.gnome.Shell.Introspect.GetWindows()的权限?
如何获取调用D-Bus接口org.gnome.Shell.Introspect.GetWindows()的权限?
你遇到的这个AccessDenied错误,本质是GNOME Shell出于安全和隐私考虑,对org.gnome.Shell.Introspect这个调试接口做了严格的权限限制——默认情况下,只有GNOME Shell自身或者拥有特殊权限的进程才能调用它的方法,普通用户直接用dbus-send调用自然会被拒绝。下面给你两种可行的解决方案:
方案一:临时通过GNOME调试工具获取窗口信息(无需改配置)
这是最快捷的临时方式,不用修改任何系统配置:
- 按
Alt+F2打开GNOME的运行对话框 - 输入
lg并回车,打开GNOME的内置调试工具Looking Glass - 切换到「Eval」标签页,输入以下代码并回车:
这样就能直接获取到所有窗口的详细信息,效果和调用global.get_window_actors().map(a => a.meta_window)GetWindows()完全一致。
方案二:修改D-Bus权限配置(永久允许调用)
如果你确实需要通过命令行调用这个接口,可以通过添加自定义D-Bus权限规则来实现:
- 先创建用户级的D-Bus配置目录(如果不存在的话):
mkdir -p ~/.local/share/dbus-1/session.d/ - 在该目录下新建一个名为
org.gnome.Shell.Introspect.conf的文件,内容如下(记得把你的用户名替换成你实际的系统用户名):<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy user="你的用户名"> <allow send_destination="org.gnome.Shell.Introspect"/> <allow send_interface="org.gnome.Shell.Introspect"/> </policy> </busconfig> - 注销当前用户再重新登录,之后再运行你的
dbus-send命令,就能成功调用GetWindows()方法了。
注意事项
修改D-Bus权限会让你的用户直接获取到系统所有窗口的敏感信息,存在一定的安全风险,建议只在调试或测试场景下使用,用完后可以删除刚才创建的配置文件,恢复默认的安全限制。
备注:内容来源于stack exchange,提问作者eminfedar
相关产品推荐
相关产品推荐

