2016-09-23 12 views
0

昇格された資格情報を使用するには、バイナリコマンドレットを作成しており、PSCredentialパラメータを受け入れたいと考えています。C#コードでPSCredentialsを使用する

[Parameter] 
public PSCredential Credential { get; set; } 

このためドキュメントの明確な不足があるようです - 私は見つけることができるすべては、私がやりたいものではありませんC#からPowerShellコマンドレットを実行する方法です。

Windowsの偽装を自分で実行しないように、SimpleImpersonationナゲットパッケージをダウンロードしました。

using (Impersonation.LogonUser("GLOBAL", "last.first", "mypassword", LogonType.Interactive)) 
{ 
    foreach (ServerInfo server in Targets) 
     ProcessRecord(); 
} 

私はSystem.Security.Principal.WindowsIdentity.GetCurrent().Nameをチェックすると、ユーザは正しいですが、私は、コマンドを実行したときに(例えばServerManager.OpenRemote(computerName)は)私がUnauthorizedAccessExceptionを受けます。目的のユーザーとして実行されているPowerShellインスタンスからこのコードを実行すると、コマンドレットは完璧に実行されます。

とにかくC#バイナリコマンドレットでPSCredentialを利用する方法の手がかりはありますか?

答えて

1

なぜこれにはほとんどドキュメントがオンラインでないのか分かりません。私が思うように、私はこれを達成するためになりすましを使用する必要がありました。これには多くの配管工事があるようですが、see hereです。

もう少し調査したら、SimpleImpersonationと呼ばれる素晴らしいナゲットパッケージがあります。

[Parameter] 
public PSCredential Credential { get; set; } 

を私はこれを行うことができます:使用

using (Impersonation.LogonUser("GLOBAL", Credential.UserName, Credential.Password, LogonType.Interactive)) 

これは私が偽装ユーザーとしてコマンドを実行することができます。 LogonUser()にはユーザー名とSecureStringのパスワードが必要です。

ServiceControllerコールではうまく動作しますが、ServerManagerはまだCOMの許可されていない例外をスローしていました。 OpenRemote()を使用せず、ctorのオーバーロードを使用すると言われたthis postが見つかりました。次のコードが動作します:

using (ServerManager serverManager = new ServerManager(@"\\server\c$\windows\system32\inetsrv\config\applicationHost.config")) 
{ 
    ApplicationPoolCollection appPool = serverManager.ApplicationPools; 
    Console.WriteLine(appPool.Count); 
} 
関連する問題