Objective-C MacOS以管理员权限运行程序

在MacOS下很多操作是需要管理员权限的, 比如我们运行chmod,在命令行下可以使用sudo chmod来申请以管理员权限运行。但是使用XCode写的程序是不能使用sudo的。

需要自己写代码来申请权限。下面是一个例子, 以管理员身份运行chmod 777

bool ChmodFileWithElevatedPrivilegesFromLocation(NSString *location)
{
    // Create authorization reference
    OSStatus status;
    AuthorizationRef authorizationRef;

    status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef);
    if (status != errAuthorizationSuccess)
    {
        NSLog(@"Error Creating Initial Authorization: %d", status);
        return NO;
    }

    AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0};
    AuthorizationRights rights = {1, &right};
    AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed |
    kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;

    status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL);
    if (status != errAuthorizationSuccess)
    {
        NSLog(@"Copy Rights Unsuccessful: %d", status);
        return NO;
    }

    // use chmod
    char *tool = "/bin/chmod";
    char *args[] = {"777", (char *)[location UTF8String], NULL};
    FILE *pipe = NULL;
    status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe);
    if (status != errAuthorizationSuccess)
    {
        NSLog(@"Error: %d", status);
        return NO;
    }

    status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights);
    return YES;
}

调用方法

bool bRet = ChmodFileWithElevatedPrivilegesFromLocation("/Library");
if(bRet)
{
    NSLog(@"error");
}
else
{
    NSLog(@"sucess");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-26 11:14:15

Objective-C MacOS以管理员权限运行程序的相关文章

C#程序以管理员权限运行

原文:C#程序以管理员权限运行 C#程序以管理员权限运行 在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录.系统注册表等可能影响系统正常运行的设置进行写操作.这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢? 下面演示 C# 程

【转】vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限

ShellExecuteEX编程 --- 获取管理员权限:http://blog.csdn.net/jhui163/article/details/5873027 怎样让你的应用程序获得管理员权限:就是在运行开发工具如vc6.0 或vs2010时,要以管理员身份运行,这样你的应用程序才可以继承 http://bbs.csdn.NET/topics/390262991 解决:在vs2010等开发工具中虽然以管理员身份编译运行了程序,可以获得管理员权限,但是当单独点击Debug或release版时,

【转】 C#程序以管理员权限运行

C#程序以管理员权限运行在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录.系统注册表等可能影响系统正常运行的设置进行写操作.这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢? 下面演示 C# 程序如何实现提示用户以管理员权限运行

C#程序以管理员权限运行【我采用了第二种,比较好用】

在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录.系统注册表等可能影响系统正常运行的设置进行写操作.这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢? 下面演示 C# 程序如何实现提示用户以管理员权限运行. 本例以WinForm

如何在程序里模拟在cmd里用管理员权限运行一条指令

转自csdn的yangw150,zhao4zhong1 转自http://www.cnblogs.com/del/archive/2008/02/13/1068229.html http://blog.csdn.net/go121015603/article/details/41870707 win7下,我想执行net user administrator /active:yes这样一条指令,用system()函数执行时返回错误,返回错误是“发生系统错误 5 拒绝访问”,原来是没有管理员权限,用

C# windows权限问题 程序如何以管理员身份运行程序

程序如何以管理员身份运行程序 最近在项目运行过程中遇到了一个问题,就是打开程序的过程中,软件会出现打开数据库是一个只读数据库,我们需要将客户端设置为以管理员身份运行才能解决这种问题.这样虽然可以解决问题但是却给用户和与用与沟通的人员带来了不便,使软件的简易性与易操作性大打折扣. 那么我们能否在开发的过程中使软件直接以管理员的身份进行运行呢,答案是肯定的.结合在网上查询的资料和我个人的理解下介绍一下. 第一步:打开VS2013右键点击项目->属性->安全性->勾选启用ClickOnce安全

Objective-C MacOS的管理员权限继承

在MacOS下可以使用AuthorizationExecuteWithPrivileges函数以管理员身份运行某个程序,凡是以管理员权限运行会弹出一个输入密码的框. 而被执行的这个程序如果再以管理员权理去执行另外一个程序,又会弹出一个框.这说明权限是没有继承的. 写过Windows程序的人应该知道, Win7上如果以管理员身份运行程序是会弹出UAC提示的, 但是被运行的这个程序, 如果再去运行其他程序, 那么其他程序就都是管理员身份了,而且不会弹UAC提示, 这说明权限是继承的. 下面我们实现M

判断当前进程是否以管理员权限运行(AllocateAndInitializeSid后,用CheckTokenMembership与AdministratorsGroup进行比较,和Delphi的那个例子还有点不一样)

在Win7下(Vista以上的...)有时某些操作就是会让人郁闷 开启了UAC的话,得以管理员权限运行才不会出现Access is denied... 但是,程序又不是非得什么时候都用那破管理员权限的 总不能在manifest里加权限,然后用户运行时老弹确认吧? 当然啦,可以将需要管理员权限的部分写到另一个小程序,需要时调用它就行了 不过还是不爽,如果是一个小小的程序还要再加另一个小小小程序的话 那好,干脆判断是不是Win7...开启了UAC没有之类 开启的话再判断下是不是以管理员权限运行,不是

C#让程序以管理员身份运行程序

步骤:一: 在Visual Studio 中--解决方案资源管理器--右键项目名称--属性,找到“安全性”选项 二:勾选“启用ClickOnce安全设置”, 三:这时,在项目下面会多出一个“app.manifest”的文件,选中它,并找到代码段<requestedExecutionLevel level="asInvoker" uiAccess="false" />,将其改为:<requestedExecutionLevel level="