Firemonkey OS X - 请求提升权限

Firemonkey OS X - Request elevated permissions

我正在开发需要启动 "openvpn" 的 OS X Firemonkey 应用程序,但 OpenVPN 需要管理员权限才能创建隧道接口。

我正在尝试将此博客 post 中的第一个示例转换为 Delphi: http://www.michaelvobrien.com/blog/2009/07/authorizationexecutewithprivileges-a-simple-example/

尝试 运行 此代码,有时会按预期产生授权提示,但单击“确定”会完全冻结调试器,并且需要关闭整个系统。它在没有调试器的情况下工作得更好 运行ning,但有时仍然会死机... 我在 return 代码崩溃之前捕获了几次,它是 errAuthorizationToolExecuteFailure

我不是很了解OSX是如何做的,有没有更好的方法? Apple 不建议为此使用 AuthorizationExecuteWithPrivileges。我不知道还有什么其他方法可以 运行 openvpn 和它需要的权限。

uses
  Macapi.CoreFoundation, Macapi.Foundation, Macapi.Security;

const
  kAuthorizationEmptyEnvironment = nil;

procedure TForm1.Button1Click(Sender: TObject);
var
  AuthRef: AuthorizationRef;
  Status: OSStatus;
begin
  Status := AuthorizationCreate(nil,kAuthorizationEmptyEnvironment,kAuthorizationFlagDefaults,@AuthRef);
  Status := AuthorizationExecuteWithPrivileges(AuthRef,'/sbin/dmesg',0,'',nil)
end;

AuthorizationExecuteWithPrivilegesarguments 参数需要一个指向 PAnsiChars 数组的指针,该数组以 nil 指针作为最后一个数组项终止。您只是将指针传递给一个空字符串。这将给你带来随机崩溃,具体取决于指向空字符串的指针之后内存中发生的情况。

试试这个:

procedure TForm1.Button1Click(Sender: TObject);
var
  AuthRef: AuthorizationRef;
  Status: OSStatus;
  argv: array[0..0] of PAnsiChar;
begin
  ArgV[0] := nil;

  AuthRef := nil;
  Status := AuthorizationCreate(nil,kAuthorizationEmptyEnvironment,kAuthorizationFlagDefaults,@AuthRef);
  Status := AuthorizationExecuteWithPrivileges(AuthRef, '/sbin/dmesg', 0, @argv[0], nil);
  AuthorizationFree(AuthRef, kAuthorizationFlagDefaults);
end;