在Mac OS上卸载/加载应用程序内核扩展

时间:2018-06-02 13:35:13

标签: macos qt admin qprocess kernel-extension

我需要在Mac OS的Qt桌面应用程序的开头卸载一堆驱动程序(kext)。 我尝试使用QProcess,但kextunload需要具有管理员权限。 有人知道解决方法吗?或者如何使用sudo启动QProcess? 我需要这对最终用户来说很容易:只需要在提示时输入管理员密码,然后应用程序完成剩下的工作。

问题是苹果在我想要使用特定驱动程序的设备上加载自己的驱动程序(FTDI232H和FT2Dxx驱动程序)。

2 个答案:

答案 0 :(得分:0)

我找到了似乎对我有用的东西:

@Nullable
@Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    // Find the ListView resource.
      View rootView = inflater.inflate(R.layout.fragment_jobs_list, container, false);
     mainListView = (ListView) rootView.findViewById( R.id.mainListView );


    // Create and populate a List of planet names.
    String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars",
            "Jupiter", "Saturn", "Uranus", "Neptune"};

    ArrayList<String> planetList = new ArrayList<String>();
    planetList.addAll( Arrays.asList(planets) );

    listAdapter = new ArrayAdapter<String>(this, R.layout.joblayoutrow, planetList);

    listAdapter.add( "Ceres" );
    listAdapter.add( "Pluto" );
    listAdapter.add( "Haumea" );
    listAdapter.add( "Makemake" );
    listAdapter.add( "Eris" );

    // Set the ArrayAdapter as the ListView's adapter.
    mainListView.setAdapter( listAdapter );
    return rootView;

}

答案 1 :(得分:0)

除非您尝试加载或卸载的kext已被特别标记为可由非特权用户加载,否则您肯定需要拥有root权限。有一个用于加载和卸载kexts的C API。它在<libkern/OSKext.h>中定义,你所追求的功能可能是:

  • OSKextCreate()
  • OSKextLoadWithOptions()
  • OSKextUnloadKextWithIdentifier()

使用提升权限调用函数的推荐方法是使用SMJobBless()安装特权帮助工具,并启动它并通过XPC与之通信。这样,在SMJobBless调用期间,用户的管理员密码只需要一次,并且对sudo不起作用的用户也有效。 (sudo仅在用户位于wheel群组时才有效,且仅在他们设置了用户密码时才有效。)