Thanks Mike. I was able to get it working on my end as well. For reference, here's my code -

# CoreFoundation framework.
_CoreFoundation = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
_CFStringCreateWithCString = _CoreFoundation.CFStringCreateWithCString
_CFStringCreateWithCString.restype = ctypes.c_void_p
_CFStringCreateWithCString.argtypes = [
    ctypes.c_void_p,
    ctypes.c_void_p,
    ctypes.c_uint32,
]
_CFRelease = _CoreFoundation.CFRelease
_CFRelease.restype = None
_CFRelease.argtypes = [ctypes.c_void_p]
_kCFStringEncodingUTF8 = 0x08000100

# Security framework.
_Security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security'))
_AuthorizationCreate = _Security.AuthorizationCreate
_AuthorizationFree = _Security.AuthorizationFree
_kAuthorizationFlagDefaults = 0
_kAuthorizationFlagInteractionAllowed = (1 << 0)
_kAuthorizationFlagExtendRights = (1 << 1)
_kAuthorizationFlagPartialRights = (1 << 2)
_kAuthorizationFlagDestroyRights = (1 << 3)
_kAuthorizationFlagPreAuthorize = (1 << 4)
_kAuthorizationFlagNoData = (1 << 20)

# ServiceManagement framework.
_ServiceManagement = ctypes.cdll.LoadLibrary(ctypes.util.find_library('ServiceManagement'))
_SMJobBless = _ServiceManagement.SMJobBless
_SMJobBless.restype = ctypes.c_bool
_SMJobBless.argtypes = [
    ctypes.c_void_p,
    ctypes.c_void_p,
    ctypes.c_void_p,
    ctypes.POINTER(ctypes.c_void_p),
]
_kSMDomainSystemLaunchd = ctypes.c_void_p.in_dll(_ServiceManagement, 'kSMDomainSystemLaunchd')
_kSMRightBlessPrivilegedHelper = 'com.apple.ServiceManagement.blesshelper'


class _AuthorizationItem(ctypes.Structure):
    _fields_ = [
        ('name', ctypes.c_char_p),
        ('valueLength', ctypes.c_uint32),
        ('value', ctypes.c_void_p),
        ('flags', ctypes.c_uint32),
    ]


class _AuthorizationRights(ctypes.Structure):
    _fields_ = [
        ('count', ctypes.c_uint32),
        ('items', ctypes.POINTER(_AuthorizationItem)),
    ]

authorization_item = _AuthorizationItem(
    name=_kSMRightBlessPrivilegedHelper,
    valueLength=0,
    value=None,
    flags=0,
)
authorization_rights = _AuthorizationRights(
    count=1,
    items=ctypes.pointer(authorization_item),
)
authorization_flags = (
    _kAuthorizationFlagDefaults
    | _kAuthorizationFlagInteractionAllowed
    | _kAuthorizationFlagPreAuthorize
    | _kAuthorizationFlagExtendRights
)
authorization_ref = ctypes.c_void_p()
status = _AuthorizationCreate(
    ctypes.byref(authorization_rights),
    None,
    authorization_flags,
    ctypes.byref(authorization_ref),
)
if status:
    print('Failed to get rights to install helper, status %d', status)
    return

try:
    executable_label = _CFStringCreateWithCString(
        None,
        b'com.kunalparmar.helper'.encode('utf-8'),
        _kCFStringEncodingUTF8,
    )
    try:
        if _SMJobBless(
            _kSMDomainSystemLaunchd,
            executable_label,
            authorization_ref,
            None,
        ):
            print('Helper installed')
        else:
            print('Failed to install helper')
    finally:
        _CFRelease(executable_label)
finally:
    _AuthorizationFree(authorization_ref, _kAuthorizationFlagDefaults)



On Mon, Nov 5, 2012 at 8:15 AM, Michael McCracken <michael.mccracken@gmail.com> wrote:
Hi Kunal, I recently wrote some code to call SMJobBless and SMJobRemove using only ctypes.
This was lots of boilerplate but works reliably.
It's GPL, so you can see the code here: http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-control-panel/trunk/view/head:/ubuntuone/controlpanel/utils/darwin.py

Please feel free to ask me if you have any questions.

-mike


On Mon, Nov 5, 2012 at 1:56 AM, Ronald Oussoren <ronaldoussoren@mac.com> wrote:

On 5 Nov, 2012, at 2:59, Kunal Parmar <kunalparmar@gmail.com> wrote:

> I'm getting an error when calling SMJobBless - "ValueError: depythonifying 'pointer', got 'LP_c_void_p'". I've tried a few things without luck. Any help will be appreciated.

It's currently not easily possible to use ctypes with PyObjC, I've filed an issue in my bitbucket about adding ctypes support to pyobjc <https://bitbucket.org/ronaldoussoren/pyobjc/issue/23/add-ctypes-support>.

Anoyingly the Security framework is not easily wrapped using the normal PyObjC mechanism's either, in particular support for C structs that contain pointers is lacking right now. I'll have to experiment a little to see if I can get your example to work properly using some other hacks.

Ronald


>
> Here's my code -
>
> from ServiceManagement import (
>     kSMDomainSystemLaunchd,
>     SMJobBless,
> )
>
> security = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Security'))
>
> class AuthorizationItem(ctypes.Structure):
>     _fields_ = [
>         ('name', ctypes.c_char_p),
>         ('valueLength', ctypes.c_uint32),
>         ('value', ctypes.c_void_p),
>         ('flags', ctypes.c_uint32),
>     ]
>
> class AuthorizationRights(ctypes.Structure):
>     _fields_ = [
>         ('count', ctypes.c_uint32),
>         ('items', ctypes.POINTER(AuthorizationItem)),
>     ]
>
> authorization_item = AuthorizationItem(
>     name='com.apple.ServiceManagement.blesshelper',
>     valueLength=0,
>     value=None,
>     flags=0,
> )
> authorization_rights = AuthorizationRights(
>     count=1,
>     items=ctypes.pointer(authorization_item),
> )
> authorization_flags = 19
> authorization_ref = ctypes.POINTER(ctypes.c_void_p)()
> status = security.AuthorizationCreate(
>     ctypes.pointer(authorization_rights),
>     None,
>     authorization_flags,
>     ctypes.pointer(authorization_ref),
> )
> SMJobBless(
>     kSMDomainSystemLaunchd,
>     'app.helper',
>     authorization_ref,
>     None,
> )
> ------------------------------------------------------------------------------
> LogMeIn Central: Instant, anywhere, Remote PC access and management.
> Stay in control, update software, and manage PCs from one command center
> Diagnose problems and improve visibility into emerging IT issues
> Automate, monitor and manage. Do more in less time with Central
> http://p.sf.net/sfu/logmein12331_d2d_______________________________________________
> Pyobjc-dev mailing list
> Pyobjc-dev@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/pyobjc-dev


------------------------------------------------------------------------------
LogMeIn Central: Instant, anywhere, Remote PC access and management.
Stay in control, update software, and manage PCs from one command center
Diagnose problems and improve visibility into emerging IT issues
Automate, monitor and manage. Do more in less time with Central
http://p.sf.net/sfu/logmein12331_d2d
_______________________________________________
Pyobjc-dev mailing list
Pyobjc-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pyobjc-dev