1

Azure Service Bus キューと Azure Worker ロールの組み合わせを使用して、多数の Azure/サービス メンテナンス タスクを自動化しようとしています。要するに、コンセプトは次のとおりです....

  1. 保守タスクは SB キューに投稿されます
  2. Worker ロールは SB キューのタスクをリッスンします
  3. ワーカー ロールは、目的の VM/Web ロール/クラウド サービスに接続し、リモートの powershell コマンドを実行します

実際には、これは開発環境内で動作している場合は期待どおりに機能しますが、worker ロールが公開された後、リモート PowerShell 接続は「アクセスが拒否されました」という応答で失敗します。接続を確立するためのコードは次のとおりです...

PSCredential cred = new PSCredential(config.Username, config.PrimaryPassword);
WSManConnectionInfo connection = new WSManConnectionInfo(true, config.PrimaryServer, 5986, "/wsman", "http://schemas.microsoft.com/powershell/Microsoft.PowerShell", cred);

using (Runspace runspace = RunspaceFactory.CreateRunspace(connection))
{
    runspace.Open();
    using (PowerShell shell = PowerShell.Create())
    {
        shell.Runspace = runspace;
        // DO SOMETHING HERE
        shell.Invoke();
    }
    runspace.Close();
}

当初、これは CA 証明書の問題ではないかと疑っていましたが、RDP 経由で worker ロールに接続し、証明書が正しく展開されていることを確認しました。さらに、リモートデスクトップ接続を使用して、「winrs -r:」コマンドを介してターゲットサーバーへの接続を達成することもできました。

確認のため、worker ロールも昇格されたアクセス許可で実行されています。

これに関する任意の助けをいただければ幸いです

前もって感謝します

4

1 に答える 1

0

多くの実験の後、Runspace.Open()コマンドは管理アクセス権を持つアカウントで実行する必要があるように見えます (昇格された権限で worker ロールを実行してもこれは達成されません)。したがって、問題を解決するために、私はやった以下...

ロールのスタートアップ タスクを使用して、次のコマンドを使用してアカウントを作成しました...

net user roleusername rolepassword /add
net localgroup Administrators roleusername /add
exit /B 0

次に、次のコードでユーザーになりすまして、新しく作成されたローカル管理者アカウントとしてロールが実行されていることを確認しました。

[DllImport("advapi32.DLL", SetLastError = true)]
public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

[DllImport("advapi32.DLL")]
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);  

[DllImport("advapi32.DLL")]
public static extern bool RevertToSelf();

public static object Impersonate(string username, string password)
{
    string domainname = ".";
    if (username.Contains(@"\"))
    {
        domainname = username.Substring(0, username.IndexOf(@"\"));
        username = username.Substring(username.IndexOf(@"\") + 1);
    }

    IntPtr securityToken;

    LogonUser(username, domainname, password, 9, 0, out securityToken);
    if (securityToken != IntPtr.Zero)
    {
        var newIdentity = new WindowsIdentity(securityToken);
        WindowsImpersonationContext impersonationContext = newIdentity.Impersonate();

        return impersonationContext;
    }

    throw new InvalidOperationException("The username or password combination was invalid, please verify your settings");
}

public static void UndoImpersonation(object impersonationContext)
{
    var context = impersonationContext as WindowsImpersonationContext;
    if (context != null) context.Undo();
}

これが、同じ問題に遭遇した他の誰かに役立つことを願っています。

于 2015-01-19T17:03:22.603 に答える