C# を使用してリモート サービスで SACL を取得する方法を知っている人はいますか? さまざまな方法を試しましたが、基本的に何も機能しません。ローカル マシンでは DACL と SACL を取得できますが、リモート マシンではどちらも取得できないようです。
私が行ったことは、クラスServiceSecurity
から継承し、クラスNativeObjectSecurity
のように機能するというクラスを作成することRegistrySecurity
です。以下は、私が持っている2つのコンストラクターです。
public ServiceSecurity(string serviceName, AccessControlSections includeSections)
: base(true, ResourceType.Service, serviceName, includeSections, null, null)
{
}
public ServiceSecurity(System.Runtime.InteropServices.SafeHandle handle, AccessControlSections includeSections)
: base(true, ResourceType.Service, handle, includeSections)
{
}
1 つ目はサービス名を使用し、2 つ目はサービスへのハンドルを想定しています。明らかに最初のものは DACL と SACL を取得するのに問題なく機能します。なぜなら、それはすべてローカルだからですServiceController
。ServiceHandle
それを取得した後、作成したクラスにサービスのプロパティを渡しますServiceSecurity
。その時点で Unauthorized Access 例外が発生します。これは、私のユーザー アカウントがドメインのドメイン管理者であり、ローカル サーバーであるため、正しくないようです。ターゲット ボックスの管理者。また、SeSecurityPrivilege
アクセスを許可する権利もあります。
誰にもアイデアはありますか?SafeHandle
私が得ているのは正しくないようですが、SafeHandle
プロパティはそれが閉じられておらず、有効なハンドルであると言っているので、何が起こっているのかよくわかりません.
データを取得するために使用しているコードは次のとおりです。
ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceName, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);
上記は、ローカルのアクセス許可と監査設定 (DACL と SACL) に対して機能します。ただし、ローカル マシンで動作するように設計されています。代わりにこれを行うと:
ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceHandle, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);
ServiceSecurity コンストラクターは、次のように SACL のローカル サーバーとリモート サーバーの両方で失敗しますが、DACL の場合は引き続き機能します。
System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity..ctor(Boolean isContainer, ResourceType resourceType, SafeHandle handle, AccessControlSections includeSections)
AccessControlSections
accessSections については、Audit または Accessの 1 つだけを指定しています。Audit は、 ServiceHandle
.
ACCESS_SYSTEM_SECURITY
更新: したがって、SACL を取得できるように、権利を持つサービスへのハンドルを取得するにはどうすればよいのでしょうか?