2017-04-13 7 views
1

나는 C# Windows 서비스 클래스가 있습니다IntPtr을 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 ... 
    } 
} 

방법 "System.Runtime.InteropServices.SafeHandle"을 (this.ServiceHandle 같은)를 IntPtr입니다 변환 할 수 있습니까? 그래서 내가 그 함수를 호출 "SetServiceObjectSecurity()"사용할 수 있습니까? 나의 궁극적 인 목표는 서비스에 관리자 권한을 부여하는 것입니다.

+0

나는 당신이 pinvoke-land에 전혀 갈 필요가 없을 것이라고 생각했을 것입니다. 필요한 보안 기능이 아직 일부 관리 코드 라이브러리에없는가요? 예 : https://msdn.microsoft.com/en-us/library/system.security.accesscontrol(v=vs.110).aspx – Neil

+2

ServiceBase.ServiceHandle은 SafeHandle이 아닌 일반 IntPtr입니다. 서비스를 안전하게 처리하는 데는 아무런 문제가 없었습니다. 서비스는 항상 핸들을 가지며 서비스가 종료 될 때까지 유효합니다. 안전 할 필요가없는 정리 작업이 없으며 단지 존재하지 않는 윙크입니다. 단순히 pinvoke 선언을 수정하고 첫 번째 인수를 IntPtr로 만듭니다. –

+0

@Neil :이 클래스는 사용할 수 있지만 약간의 노력이 필요합니다. 특히'ServiceSecurity' 또는'ServiceAccessRule' 클래스는 기본적으로 제공되지 않습니다. 이것들은 총 50 줄의 코드입니다 (주로 상용구입니다). 장점은 보안 설명자 또는 관리되지 않는 호출을 사용하지 않아도된다는 의미입니다. –

답변

0

여기에 설명 된대로 SafeHandle.SetHandle(IntPtr handle)을 사용해 보셨습니까? https://msdn.microsoft.com/de-de/library/system.runtime.interopservices.safehandle.sethandle(v=vs.110).aspx이 맞는지 확인해 보셨습니까?

편집 : SafeHandle.SetHandle(IntPtr handle) 이후 , 당신은이 같은 파생 클래스를 보호 방법을 만들 수있다 :

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

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

나는 정확성이 테스트를하지 않은, 그래서이 방법을 작동하는지 알 수 없지만 그것을 원한다.

+0

"SafeHandle sHandle; sHandle.SetHandle();"과 같은 SafeHandle 인스턴스에서 SetHandle() 메서드에 액세스 할 수 없습니다. 또는 직접 "SafeHandle.SetHandle();"을 사용하십시오. – Arnoj

+0

@Arnoj 오, 미안 해요, 방금 방금 보호 된 방법이라는 것을 알았습니다. 당신이 그것을 사용할 수 없다는 것이 맞습니다. 나는 지금 대안을 찾고있다. –

+0

@Arnoj가 내 대답을 편집했습니다. 아마도 지금 당신을 위해 작동합니다. –