ADSI / IIS管理およびASP.NET偽装
-
03-07-2019 - |
質問
ネットワーク上の異なるサーバー上の複数のIISインストールを管理できる小さなWebアプリを作成中です。ドメインコントローラーはありません。
win32 apiとそのLogonUserメソッドを使用する小さな偽装コントローラーを作成しました。次に、System.DirectoryServicesとIIS ADSIプロバイダーを使用して、新しいサイトを作成します。
次のルーチンがあります(読みやすくするために、一部の値をクリアテキスト文字列と交換しました):
if (impersonationSvc.ImpersonateValidUser("Administrator@SRV6", String.Empty, "PASSWORD))
{
string metabasePath = "IIS://" + server.ComputerName + "/W3SVC";
DirectoryEntry w3svc = new DirectoryEntry(metabasePath, "Administrator", "PASSWORD");
string serverBindings = ":80:" + site.HostName;
string homeDirectory = server.WWWRootNetworkPath + "\\" + site.FolderName;
object[] newsite = new object[] { site.Name, new object[] { serverBindings }, homeDirectory };
object websiteId = (object)w3svc.Invoke("CreateNewSite", newsite);
int id = (int)websiteId;
impersonationSvc.UndoImpersonation();
}
このルーチンは、Webアプリがホストされているサーバー(SRV6)を使用するときに機能します。新しいサイトが作成されます。
たとえば、ネットワーク上の別のサーバー(ドメインなし)でSRV5を使用すると、ImpersonateValidUserは機能しますが、DirectoryEntryは作成されますが、w3svc.Invokeは次のエラーで失敗します。
[COMException(0x80070005):Access denied]
System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +377678
System.DirectoryServices.DirectoryEntry.Bind() +36
System.DirectoryServices.DirectoryEntry.get_NativeObject() +31
System.DirectoryServices.DirectoryEntry.Invoke(String methodName, Object[] args) +53
...
誰も私がこれを解決する方法を知っていますか?
解決
この状況では、なりすましを使用できません。偽装しているアカウントには、ローカルマシンでのログイン特権が必要です。
Webサーバーがドメインの一部ではない場合、Webサービスに関するTant102のアイデアが唯一の方法だと思います。
他のヒント
SRV5のイベントログを調べて、そのサーバーに接続するときに使用される特権を確認します。セキュリティログにエラーを記録するには、グループポリシーを変更する必要がある場合があります。
サーバー上でWebサービスをセットアップする方が簡単に聞こえますが、できればログインやIP制限で保護されているため、この種の操作を実行できます。