2017-04-13 2 views
1

Je classe C# de service Windows:Comment convertir IntPtr en SafeHandle?

class MyService : ServiceBase 
{ 
    private void InitializeComponent() { 
     //some other code ... 
     SafeHandle sHandle = this.ServiceHandle; // I want to do this but this fails. 
     SetServiceObjectSecurity(sHandle, secInfo, binaryDescriptor); 
     //some more code ... 
    } 
} 

Comment convertir un IntPtr (comme this.ServiceHandle) à un "System.Runtime.InteropServices.SafeHandle"? pour que je puisse l'utiliser dans l'appel de la fonction "SetServiceObjectSecurity()"? Mon but ultime est de donner l'autorisation d'administration au Service.

+0

J'aurais pensé que vous n'auriez pas du tout besoin d'aller dans pin-coke-land. Êtes-vous sûr que les fonctions de sécurité dont vous avez besoin ne se trouvent pas déjà dans une bibliothèque de code managée? par exemple. https://msdn.microsoft.com/en-us/library/system.security.accesscontrol(v=vs.110).aspx – Neil

+2

ServiceBase.ServiceHandle est un IntPtr simple, pas un SafeHandle. Il n'y avait aucun intérêt à en faire une poignée sûre, un service a toujours une poignée et il reste valide jusqu'à ce que le service se termine. Et il n'y a pas de nettoyage qui doit être sûr, il disparaît juste de l'existence. Il suffit de corriger votre déclaration pinvoke et de faire un premier argument IntPtr. –

+0

@Neil: ces classes sont utilisables, mais nécessitent quelques efforts. En particulier, il n'y a pas de classes 'ServiceSecurity' ou' ServiceAccessRule' dans la boîte. Ce sont environ 50 lignes de code au total (la plupart du temps). Du côté positif, cela signifie que vous n'avez pas à fouiller avec des descripteurs de sécurité ou des appels non gérés. –

Répondre

0

Avez-vous essayé d'utiliser SafeHandle.SetHandle(IntPtr handle) comme expliqué ici https://msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.sethandle(v=vs.110).aspx et de voir si cela fonctionne pour vous?

EDIT: Depuis SafeHandle.SetHandle(IntPtr handle) est une méthode protégée, vous pouvez créer une classe dérivée comme ceci:

public class SafeHandleExtended : SafeHandle 
{ 
    public void SetHandleExtended(IntPtr handle) 
    { 
     this.SetHandle(handle); 
    } 

    // .. SafeHandle's abstract methods etc. that you need to implement 
} 

Bien que je ne l'ai pas testé ce pour l'exactitude, donc je ne sais pas si cela fonctionne de la façon dont vous Je le veux.

+0

Je n'ai pas accès à la méthode SetHandle() à partir de l'une ou l'autre instance de SafeHandle comme ceci: "SafeHandle sHandle; sHandle.SetHandle();" ou directement en utilisant "SafeHandle.SetHandle();" – Arnoj

+0

@Arnoj oh je suis désolé, je viens de voir que c'est une méthode 'protected' donc il est correct que vous ne pouvez pas l'utiliser. Je cherche des alternatives maintenant. –

+0

@Arnoj a édité ma réponse, peut-être que cela fonctionne pour vous maintenant –