Macos Firemonkey OS X-请求提升的权限

Macos Firemonkey OS X-请求提升的权限,macos,delphi,firemonkey,Macos,Delphi,Firemonkey,我正在开发一个OS X Firemonkey应用程序,它需要启动“openvpn”,但openvpn需要管理员权限才能创建隧道接口 我正在尝试将此博客文章中的第一个示例转换为Delphi: 尝试运行此代码时,有时会出现预期的授权提示,但单击“确定”会完全冻结调试器,需要关闭整个系统的电源。它在没有调试器的情况下运行会更好,但有时仍然会冻结。。。 在返回代码崩溃几次之前,我已经捕捉到了它,它是ErraAuthorizationToolExecuteFailure 我不太熟悉OSX是如何工作的,有

我正在开发一个OS X Firemonkey应用程序,它需要启动“openvpn”,但openvpn需要管理员权限才能创建隧道接口

我正在尝试将此博客文章中的第一个示例转换为Delphi:

尝试运行此代码时,有时会出现预期的授权提示,但单击“确定”会完全冻结调试器,需要关闭整个系统的电源。它在没有调试器的情况下运行会更好,但有时仍然会冻结。。。 在返回代码崩溃几次之前,我已经捕捉到了它,它是ErraAuthorizationToolExecuteFailure

我不太熟悉OSX是如何工作的,有更好的方法吗?苹果不建议为此使用
授权ExecuteWithPrivileges
。我不知道有什么其他方法可以运行openvpn并拥有它所需要的权限

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


AuthorizationExecuteWithPrivileges
arguments
参数需要指向以nil指针作为最后一个数组项终止的PAnsiChars数组的指针。您只需传递一个指向空字符串的指针。根据指针指向空字符串后内存中发生的情况,这将导致随机崩溃

试试这个:

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;
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;