gpt4 book ai didi

linux - 为什么 accountsservice 总是返回一个空的用户列表?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:03 25 4
gpt4 key购买 nike

我试图获取 Vala 中的系统用户列表,但我得到的只是一个空列表。由于 Vala 文档非常简单,我不知道如何解决这个问题。这就是我正在尝试的:

var users_list = Act.UserManager.get_default ().list_users ();

最佳答案

看起来好像 UserManager 在创建时没有可用的数据。数据仅在 is_loaded 属性为真时可用。

在 GLib 中,可以在属性更改时发出 notify 信号。因此,我们将在以下工作示例中利用这一点:

int main () {
var loop = new EventLoop ();
var manager = new UserManager (loop);
if (!manager.is_running) {
print ("AccountsService is not running\n");
return 1;
}
loop.run ();
return 0;
}

class UserManager {

private Act.UserManager manager;
private EventLoop loop;

public bool is_running {
get { return !manager.no_service (); }
}

public UserManager (EventLoop event_loop) {
loop = event_loop;
manager = Act.UserManager.get_default ();
manager.notify["is-loaded"].connect( this.loaded );
}

void loaded (ParamSpec property) {
print (@"Property \"$(property.name)\" has changed\n");
this.print_users ();
this.loop.quit ();
}

void print_users () {
if (!manager.is_loaded) { return; }
print ("%-20s | %-20s\n", "User name", "Logged In Time");
foreach (var user in manager.list_users ()) {
print ("%-20s | %-20s\n",
user.user_name,
new DateTime.from_unix_local(user.login_time).to_string()
);
}
}
}

class EventLoop {

private MainLoop loop;

public EventLoop () {
loop = new MainLoop ();
}

public void run() {
this.loop.run ();
}

public void quit() {
Idle.add (()=> {
this.loop.quit ();
return Source.REMOVE;
});
}
}

该示例创建了一个 UserManager 类来包装 AccountsService UserManager。假定用户管理器在 Act.UserManager.get_default () 首次返回时从未加载,因此作为构造函数的一部分,在 is_loaded 时设置回调> 属性变化。这是一行:

manager.notify["is-loaded"].connect( this.loaded );

管理器 有一个通知信号,当任何属性更改时都会发出该信号。该示例使用信号细节仅在 is-loaded 属性更改时触发。由于某种原因,它在名称中使用破折号而不是下划线。我找不到任何关于为什么会这样的文件。使用 notify 信号,回调可以接受 ParamSpec。作为论据。这用于查找更改的属性的详细信息,但在示例中不再需要,因为使用了 "is-loaded" 信号详细信息。

该示例还创建了一个 EventLoop 类,作为 GLib 的 MainLoop 的包装器。 UserManagerEventLoop 作为依赖项,因此事件循环可以退出并完成程序。

另一种方法是直接从 Vala 使用 org.freedesktop.Accounts D-Bus 服务。

关于linux - 为什么 accountsservice 总是返回一个空的用户列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44627742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com