나는 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()"사용할 수 있습니까? 나의 궁극적 인 목표는 서비스에 관리자 권한을 부여하는 것입니다.
나는 당신이 pinvoke-land에 전혀 갈 필요가 없을 것이라고 생각했을 것입니다. 필요한 보안 기능이 아직 일부 관리 코드 라이브러리에없는가요? 예 : https://msdn.microsoft.com/en-us/library/system.security.accesscontrol(v=vs.110).aspx – Neil
ServiceBase.ServiceHandle은 SafeHandle이 아닌 일반 IntPtr입니다. 서비스를 안전하게 처리하는 데는 아무런 문제가 없었습니다. 서비스는 항상 핸들을 가지며 서비스가 종료 될 때까지 유효합니다. 안전 할 필요가없는 정리 작업이 없으며 단지 존재하지 않는 윙크입니다. 단순히 pinvoke 선언을 수정하고 첫 번째 인수를 IntPtr로 만듭니다. –
@Neil :이 클래스는 사용할 수 있지만 약간의 노력이 필요합니다. 특히'ServiceSecurity' 또는'ServiceAccessRule' 클래스는 기본적으로 제공되지 않습니다. 이것들은 총 50 줄의 코드입니다 (주로 상용구입니다). 장점은 보안 설명자 또는 관리되지 않는 호출을 사용하지 않아도된다는 의미입니다. –