【问题标题】:Cocoa : is there a way to know if the user has set "Set date & time automatically" in system preferences?Cocoa:有没有办法知道用户是否在系统偏好设置中设置了“自动设置日期和时间”?
【发布时间】:2015-04-23 21:06:52
【问题描述】:

我想知道 Cocoa 应用程序是否有办法知道用户是否在他的系统偏好设置中设置了“自动设置日期和时间”。如果是这样,我还想知道上次时钟更新的时间。 非常感谢您提供的任何帮助。

【问题讨论】:

  • 你想做什么?
  • 您好,感谢您的快速回复...如果互联网时间不活跃,我想拒绝使用我的应用程序,以便我可以肯定地信任系统时钟。似乎'systemsetup -getusingnetworktime'是官方解决方案,但它需要root权限,甚至不能以管理员身份运行。谢谢

标签: objective-c macos cocoa


【解决方案1】:

您可以尝试使用STPrivilegedTask(或类似的)以root 权限运行任务,然后解析结果。 Hack-y/不是最好的,但它应该可以工作。

编辑:

- (BOOL)networkTimeEnabled {
    STPrivilegedTask *task = [[STPrivilegedTask alloc] initWithLaunchPath:@"/usr/bin/sudo" arguments:@[@"/usr/sbin/systemsetup",@"-getusingnetworktime"]];
    if ([task launch] == noErr) {
        NSData *data = [task.outputFileHandle readDataToEndOfFile];
        [task waitUntilExit];

        NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSString *status = [result componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet][2];
        return ([status isEqualToString:@"On"]);
    }
    return NO;
}

【讨论】:

  • 非常感谢 Seb 的回答...不幸的是,我确实尝试过,但 systemsetup 在 STPrivilegedTask 下继续失败,因为它需要由 root 执行,而不仅仅是管理员。我已经通过反汇编系统设置检查了这一点。我还在它的根检查中对其进行了修补,但是分发我的应用程序并在其中运行一个被篡改的系统设置将超出任何良好设计的规则。再次感谢。另一个建议的解决方案是搜索 root 拥有的正在运行的 ntpd 进程。如果有,那么您可以假设网络时间是开启的,但是,这只是一个假设。
  • @AlfonsoTesauro 嗯。老实说,systemsetup 在终端中使用sudo 和通过这种方法为我工作。您对ntpd 进程运行的假设似乎是正确的(通过禁用/启用“自动设置日期和时间”进行测试),但似乎methods to get a full process listing to actually check for it have been deprecated..
  • 显然他们最近改变了这个系统设置行为。你在运行 Yosemite 10.10.3 吗?关于进程,我正在考虑使用 NSTask 调用 ps -ax ...我相信这是一种相当受支持的方法,并且可以假定它存在于许多 Mac Os X 版本中。
  • @AlfonsoTesauro 我正在运行 Yosemite 10.10.3。无论如何,您的 NSTask 解决方案似乎是个好主意。您可以尝试pgrep -f "ntpd" 或类似的方式 - 如果它正在运行,它将返回ntpd 的进程号,否则将返回任何内容。
  • 我在link 上阅读了有关反汇编和修补系统设置的信息。非常感谢您的帮助。
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2017-08-22
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多