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.
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
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. –
@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. –