2009-06-10 28 views
7

私は、ADSIを使用してIISメタベースを照会するWebページ内でコードを実行しています。コードは次のと同じくらい簡単です:DefaultAppPoolはIISで特権昇格特権で実行されますか?

 DirectoryEntry iisNode = 
     new DirectoryEntry("/LM/W3SVC/1/ROOT/MyAspWebsite-1-128886021498831845"); 
     foreach (DirectoryEntry de in iisNode.Parent.Children) 
     { 
      System.Console.WriteLine(de.Name); 
     } 

私はIIS7/W2K8上のDefaultAppPool下のページ/サイトを実行したときにこれが正常に動作します。しかし、私は自分のアプリケーションプールを作成し、デフォルトのアプリケーションプールと同じ性質を残したときに、このコードは、次のエラーで失敗します。

のDefaultAppPoolは特別な何の権限を持っているん
Caught: System.Runtime.InteropServices.COMException 
Failed to parse virtual directory: 
     /LM/W3SVC/1/ROOT/MyAspWebsite-1-128889542757187500 
System.Runtime.InteropServices.COMException (0x80070005): Access is denied. 

?私は何も書かれていないと思う。私は非デフォルトのアプリケーションプールでこれを動作させる必要がありますが、を使わずにを実行すると、ワーカープロセスの昇格された権限が与えられます。また、IIS7が実行されているマシン上のAdminを使って、DirectoryEntryコンストラクタのユーザ名とパスワードのパラメータを使用しようとしましたが、何も変更されませんでした。また、IIS6とW2K3上でが正常に動作することにも注意してください。

何か助けていただければ幸いです。

+0

両方のアプリケーションプールが同じIDで実行されていることを確認してください。 – kemiller2002

+0

はい、プロセスエクスプローラを見ると、両方ともNT AUTHORITY \ NETWORK SERVICEとして実行されており、どちらも整合性が「システム」です。 w3wp.exeの両方のインスタンスの詳細プロパティのプロセスエクスプローラの[セキュリティ]タブを見ると、それらのグループはまったく同じグループに属し、DefaultAppPoolはIIS APPPOOL \ DefaultAppPoolグループの一部です。カスタムアプリケーションプールはIIS APPPOOL \ CustomAppPoolグループに属します。 –

+0

独自のapp-poolを作成したとしたら、新しいapp-poolを作成して既存のappを追加するだけですが失敗しますか?または、新しいアプリケーションプールに関連付けられたまったく新しいサイト(したがって、おそらくルート上のアプリ)を作成していますか? おそらく許可の問題は、パス/ LM/W3SVC/1/ROOT ...のサイトID 1への参照のためですか? – Aaron

答えて

2

これはわかりませんが、コードを実行している実際のIDがプロセスエクスプローラのw3wp.exeにリストされているものと異なる場合があります。ブレークポイントを設定するか、COMException/"Access denied"違反をスローするコードの違反行(DirectoryEntry.Parent.Children)の近くでWindowsIdentity.GetCurrent().Nameを実行する必要があります。

たとえば、上記のように、私のアプリケーションプールプロセスw3wp.exeは、タスクマネージャウィンドウでNETWORK SERVICEとして実行されていました。しかし、実際のランタイムIDを確認すると、新しいIIS7ビルトインユーザーIUSRが表示されました。このユーザーは、IIS6の値とは異なり、NETWORK SERVICEでした。

using System.Security.Principal; 

Console.WriteLine(
    WindowsIdentity.GetCurrent().Name); // IUSR on IIS7, NETWORKSERVICE on IIS6 
foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children)) 
{ 
    System.Console.WriteLine(de.Name); 
} 

IIS6で、ネットワークサービスがDirectoryEntryクラスでのActive Directoryサービスインターフェイス(ADSI)を介してIIS Metabaseを探索するための権限を持っていたようです。しかし、IIS7の新しいIUSR IDはありません。

using (new MyImpersonationWrapper("admin","pass")) 
{ 
    foreach (var de in DirectoryEntry("/LM/W3SVC/1/ROOT/MySite".Parent.Children)) 
    { 
     System.Console.WriteLine(de.Name); 
    } 
} 

独自の偽装ラッパーを実装し、適切なローカルアカウントを確保するには、私は残しておきます行使である:上記のコードを実行するためには、直接impersonate an account既存のADSIと、たとえば、読み取り権限をする必要がありますあなたの(セキュリティの)必要性が変わることがあります。

suggested on this MSDN blog postの代わりにWMI provider for IIS7を使用して、必要な情報を参照することができます。

-2

ディレクトリエントリにアクセスしているパスを確認します。競合するサービスがある可能性があります。イベントビューアを確認してください。

このリンクは、同様の問題があったとbecause Skype was running on port 80 it was causing a conflict with the path.

しかし、あなたの質問に本当の答えはあるが、「いいえ、デフォルトのアプリケーションプールについて何か特別なことがない」ことがわかった誰かに行きます。

+0

私がディレクトリエントリにアクセスしているパスはどういう意味ですか? IISメタベースへのパスです。ポートはこれと何をしなければなりませんか?私が理解しているように、IIS7のメタベースはXMLファイルに格納されています。 –

+0

私が入れたリンクは、ポート80に何か他のものがあるとあなたのパスにある/ 1 / –

-2

NetWorkServicesユーザーがアクセスしようとしている物理ディレクトリにアクセスできることを確認します。それはあなたが働いているサイトと違うサイトにアクセスしているというエラーによって、正しく表示されますか?

カスタムAppPoolの設定を変更しない限り、既定のAppPoolと作成するAppPoolについて特別なことはありません。IISはAppPoolを実行するためにセットアップされたユーザーのアクセス許可を使用します。

0

起こっているが、私はあなたがこのようなセットアップを持って理解して何からかもしれないまさにあなたの説明から言うには少し難しいです:

DefaultWebSite 
    | 
    +-- VirtualDirectory 
     | 
     +-- ShowIISMetaData.aspx 

私は問題がページをすることになっているということだと思いますIISメタデータが に親の子を見ていることを示します(他の言葉の兄弟)。

foreach (DirectoryEntry de in iisNode.Parent.Children) 

デフォルトのWebサイトのアプリケーションプールと仮想ディレクトリが同じ 物理プールされている場合にのみ動作します。

0

この問題では情報が欠落しています。 両方のアカウントが同じユーザーアカウントで実行されているため、動作が同じである必要があります。 IISのバニラインストールでコードを実行してみることをお勧めしますが、問題はまだ発生しますか?

他の人は、アカウントが同じであれば、あなたがメタベースの変更を行ったためと言います。

0

アプリケーションプールに関連付けられた資格情報は、ADのクエリを試みるときに使用される資格情報になります。したがって、両方のAppプールがあなたの問題ではない同じ資格情報で実行されている場合。

テストサイトで異なる認証設定をしていますか?たとえば、選択したものを1つに統合し、別のものに統合していない場合、発生している動作を説明することができます。

関連する問題