如何:檢視及修改訂閱和安全性設定 (RMO 程式設計)

在建立發行集與訂閱時,會定義複寫所需的安全性帳戶設定 (登入和密碼)。您可以使用「複寫管理物件」(RMO) 在稍後變更這些設定。您所使用的 RMO 類別和屬性,將取決於代理程式的類型和伺服器連接的類型而定。

安全性注意事項安全性注意事項

可能的話,系統會在執行階段提示使用者輸入安全性認證。如果您必須儲存認證,請使用 Microsoft Windows .NET Framework 提供的<密碼編譯服務>(英文)。

變更複寫伺服器上儲存的所有密碼執行個體

  1. 使用 ServerConnection 類別建立與複寫伺服器的連接。

  2. 使用步驟 1 中的連接建立 ReplicationServer 類別的執行個體。

  3. 呼叫 ChangeReplicationServerPasswords 方法。指定下列參數:

    • security_mode - ReplicationSecurityMode 值,可指定變更所有密碼執行個體所針對的驗證類型。

    • login - 變更所有密碼執行個體所針對的登入。

    • password - 新的密碼值。

      安全性注意事項安全性注意事項

      可能的話,系統會在執行階段提示使用者輸入安全性認證。如果您必須儲存認證,請使用 Windows .NET Framework 提供的<密碼編譯服務>(英文)。

      [!附註]

      只有 sysadmin 固定伺服器角色的成員,才能呼叫這個方法。

  4. 在必須更新密碼的複寫拓撲中,於每一部伺服器上重複步驟 1-3。

針對交易式發行集的發送訂閱變更散發代理程式的安全性設定

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 TransSubscription 類別的執行個體。

  3. 針對訂閱設定 PublicationNameDatabaseNameSubscriberNameSubscriptionDBName 屬性,並針對 ConnectionContext 屬性設定步驟 1 中的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。如果此方法傳回 false,則表示步驟 3 中的訂閱屬性定義不正確,或者此訂閱不存在。

  5. TransSubscription 的執行個體上設定以下其中一個或多個安全性屬性:

  6. (選擇性) 如果您已針對 CachePropertyChanges 指定 true 的值,請呼叫 CommitPropertyChanges 方法來認可伺服器上的變更。如果您已針對 CachePropertyChanges 指定 false 的值 (預設值),則會立即將變更傳送到伺服器。

針對交易式發行集的提取訂閱變更散發代理程式的安全性設定

  1. 使用 ServerConnection 類別建立與訂閱者的連接。

  2. 建立 TransPullSubscription 類別的執行個體。

  3. 針對訂閱設定 PublicationNameDatabaseNamePublisherNamePublicationDBName 屬性,並針對 ConnectionContext 屬性設定步驟 1 中的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。如果此方法傳回 false,則表示步驟 3 中的訂閱屬性定義不正確,或者此訂閱不存在。

  5. TransPullSubscription 的執行個體上設定以下其中一個或多個安全性屬性:

  6. (選擇性) 如果您已針對 CachePropertyChanges 指定 true 的值,請呼叫 CommitPropertyChanges 方法來認可伺服器上的變更。如果您已針對 CachePropertyChanges 指定 false 的值 (預設值),則會立即將變更傳送到伺服器。

針對合併式發行集的提取訂閱變更合併代理程式的安全性設定

  1. 使用 ServerConnection 類別建立與訂閱者的連接。

  2. 建立 MergePullSubscription 類別的執行個體。

  3. 針對訂閱設定 PublicationNameDatabaseNamePublisherNamePublicationDBName 屬性,並針對 ConnectionContext 屬性設定步驟 1 中的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。如果此方法傳回 false,則表示步驟 3 中的訂閱屬性定義不正確,或者此訂閱不存在。

  5. MergePullSubscription 的執行個體上設定以下其中一個或多個安全性屬性:

  6. (選擇性) 如果您已針對 CachePropertyChanges 指定 true 的值,請呼叫 CommitPropertyChanges 方法來認可伺服器上的變更。如果您已針對 CachePropertyChanges 指定 false 的值 (預設值),則會立即將變更傳送到伺服器。

針對合併式發行集的發送訂閱變更合併代理程式的安全性設定

  1. 使用 ServerConnection 類別建立與發行者的連接。

  2. 建立 MergeSubscription 類別的執行個體。

  3. 針對訂閱設定 PublicationNameDatabaseNameSubscriberNameSubscriptionDBName 屬性,並針對 ConnectionContext 屬性設定步驟 1 中的連接。

  4. 呼叫 LoadProperties 方法以取得物件的屬性。如果此方法傳回 false,則表示步驟 3 中的訂閱屬性定義不正確,或者此訂閱不存在。

  5. MergeSubscription 的執行個體上設定以下其中一個或多個安全性屬性:

  6. (選擇性) 如果您已針對 CachePropertyChanges 指定 true 的值,請呼叫 CommitPropertyChanges 方法來認可伺服器上的變更。如果您已針對 CachePropertyChanges 指定 false 的值 (預設值),則會立即將變更傳送到伺服器。

變更立即更新訂閱者連接到交易式發行者時所用的登入資訊

  1. 使用 ServerConnection 類別建立與訂閱者的連接。

  2. 為訂閱資料庫建立 ReplicationDatabase 類別的執行個體。指定 Name 並針對 ConnectionContext 指定步驟 1 中的 ServerConnection

  3. 呼叫 LoadProperties 方法以取得物件的屬性。如果此方法傳回 false,則表示步驟 2 中的資料庫屬性定義不正確,或者此訂閱資料庫不存在。

  4. 呼叫 LinkPublicationForUpdateableSubscription 方法,傳遞以下參數:

    • Publisher - 發行者的名稱。

    • PublisherDB - 發行集資料庫的名稱。

    • Publication - 立即更新訂閱者訂閱的發行集名稱。

    • Distributor - 散發者的名稱。

    • PublisherSecurity - PublisherConnectionSecurityContext 物件,可在連接到發行者和連接的登入認證時,指定立即更新訂閱者所使用之安全性模式的類型。

範例

這個範例會檢查提供的登入值,並針對提供的 Windows 登入或 SQL Server 登入 (在伺服器上由複寫儲存) 變更其所有密碼。

         // Set the Distributor and distribution database names.
            string serverName = publisherInstance;

            ReplicationServer server;
            
            // Create a connection to the Distributor using Windows Authentication.
            ServerConnection conn = new ServerConnection(serverName);

            try
            {
                // Open the connection. 
                conn.Connect();

                server = new ReplicationServer(conn);

                // Load server properties, if it exists.
                if (server.LoadProperties())
                {
                    string[] slash = new string[1];
                    slash[1] = @"\";

                    // If the login is in the form string\string, assume we are 
                    // changing the password for a Windows login.
                    if (login.Split(slash, StringSplitOptions.None).Length == 2)
                    {
                        //Change the password for the all connections that use
                        // the Windows login. 
                        server.ChangeReplicationServerPasswords(
                                ReplicationSecurityMode.Integrated, login, password);
                    }
                    else
                    {
                        // Change the password for the all connections that use
                        // the SQL Server login. 
                        server.ChangeReplicationServerPasswords(
                                ReplicationSecurityMode.SqlStandard, login, password);
                    }
                }
                else
                {
                    throw new ApplicationException(String.Format(
                        "Properties for {0} could not be retrieved.", publisherInstance));
                }
            }
            catch (Exception ex)
            {
                // Implement the appropriate error handling here. 
                throw new ApplicationException(String.Format(
                    "An error occured when changing agent login " +
                    " credentials on {0}.",serverName), ex);
            }
            finally
            {
                conn.Disconnect();
            }
' Set the Distributor and distribution database names.
Dim serverName As String = publisherInstance

Dim server As ReplicationServer

' Create a connection to the Distributor using Windows Authentication.
Dim conn As ServerConnection = New ServerConnection(serverName)

Try
    ' Open the connection. 
    conn.Connect()

    server = New ReplicationServer(conn)

    ' Load server properties, if it exists.
    If server.LoadProperties() Then

        ' If the login is in the form string\string, assume we are 
        ' changing the password for a Windows login.
        If login.Split("\").Length = 2 Then

            ' Change the password for the all connections that use
            ' the Windows login. 
            server.ChangeReplicationServerPasswords( _
            ReplicationSecurityMode.Integrated, login, password)
        Else

            ' Change the password for the all connections that use
            ' the SQL Server login. 
            server.ChangeReplicationServerPasswords( _
            ReplicationSecurityMode.SqlStandard, login, password)
        End If
    Else
        Throw New ApplicationException(String.Format( _
         "Properties for {0} could not be retrieved.", publisherInstance))
    End If
Catch ex As Exception
    ' Implement the appropriate error handling here. 
    Throw New ApplicationException(String.Format( _
     "An error occured when changing agent login " + _
     " credentials on {0}.", serverName), ex)
Finally
    conn.Disconnect()
End Try