{"id":14179,"date":"2020-05-19T15:47:25","date_gmt":"2020-05-19T13:47:25","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/"},"modified":"2025-10-01T11:44:22","modified_gmt":"2025-10-01T09:44:22","slug":"sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/","title":{"rendered":"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools"},"content":{"rendered":"<p>The SQL Server environment\u00a0 I worked with today has dozens of SQL Server instances using AlwaysOn Availability Groups for High Availability.<br \/>When a login is created on the Primary replica of an Availability Group it is not synchronized automatically on secondary replicas. This might cause some issues after a failover (Failed logins).<\/p>\n<p>Since this is not done automatically by SQL Server out of the box the DBA has to perform this task.<br \/>To avoid doing this with T-SQL (<a href=\"https:\/\/support.microsoft.com\/en-us\/help\/918992\/how-to-transfer-logins-and-passwords-between-instances-of-sql-server\">sp_help_revlogin<\/a>) or SSMS I use the magical <a href=\"https:\/\/dbatools.io\/\">dbatools<\/a> and perform the following tasks once a week.<span style=\"font-family: Calibri;font-size: 11.0pt;font-weight: normal;font-style: normal\"><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-39905 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\" alt=\"dbatools\" width=\"300\" height=\"108\" \/><\/a><\/span><\/p>\n<ol type=\"1\">\n<li value=\"1\">Get the number of logins on each instance.<\/li>\n<\/ol>\n<div>\n<div id=\"highlighter_833404\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell variable\">$primary<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell functions\">Get-DbaLogin<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell string single\">'SQL01\\APPX'<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"powershell variable\">$primary<\/code><code class=\"powershell plain\">.Count<\/code><\/div>\n<div class=\"line number3 index2 alt2\">\u00a0<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"powershell variable\">$secondary<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell functions\">Get-DbaLogin<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell string single\">'SQL02\\APPX'<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"powershell variable\">$secondary<\/code><code class=\"powershell plain\">.Count<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div>\n<div id=\"highlighter_374956\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell plain\">PS C:\\&gt; <\/code><code class=\"powershell variable\">$primary<\/code><code class=\"powershell plain\">.Count<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"powershell plain\">41<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"powershell plain\">PS C:\\&gt; <\/code><code class=\"powershell variable\">$secondary<\/code><code class=\"powershell plain\">.Count<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"powershell plain\">40<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<ol type=\"1\">\n<li value=\"2\">If numbers don&#8217;t match, I use the Copy-Login function to synchronize the missing login.<\/li>\n<\/ol>\n<div>\n<div id=\"highlighter_72045\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell functions\">Copy-DbaLogin<\/code> <code class=\"powershell color1\">-Source<\/code> <code class=\"powershell string single\">'SQL01\\APPX'<\/code> <code class=\"powershell color1\">-Destination<\/code> <code class=\"powershell string single\">'SQL02\\APPX'<\/code> <code class=\"powershell plain\">`<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell color1\">-Login<\/code> <code class=\"powershell plain\">((<\/code><code class=\"powershell variable\">$primary<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">Where-Object<\/code> <code class=\"powershell plain\">Name<\/code> <code class=\"powershell color1\">-notin<\/code> <code class=\"powershell variable\">$secondary<\/code><code class=\"powershell plain\">.Name).Name)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<div>\n<div id=\"highlighter_495228\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell plain\">PS C:\\&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"powershell plain\">Type\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Status\u00a0\u00a0\u00a0\u00a0 Notes<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"powershell plain\">----\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ----\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ------\u00a0\u00a0\u00a0\u00a0 -----<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"powershell plain\">Login - SqlLogin loginName\u00a0\u00a0\u00a0 Successful<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Obviously, there are many drawbacks to this process;<\/p>\n<ul>\n<li>Having the same number of logins doesn&#8217;t mean they are actually the same.<br \/>Some logins can be missing on both sides compared to the other one and both instances have the same number of logins.<\/li>\n<li>I need to know which instance is the current primary replica (-Source in Copy-DbaLogin)<\/li>\n<li>This is a manual process I do on every pair of instances using AlwaysOn.<\/li>\n<li>I want a script that can manage any number of secondary replica<\/li>\n<\/ul>\n<p>So I decided to write a new script that would automatically synchronize login from primary replicas to all secondary replicas. The only parameter I want to use as input for this script is the name of the listener.<\/p>\n<p>Here is the simplest version of this script I could write;<\/p>\n<div>\n<div id=\"highlighter_893494\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell variable\">$lsn<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell string single\">'APP01-LSTN'<\/code><\/div>\n<div class=\"line number2 index1 alt1\">\u00a0<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"powershell variable\">$primaryReplica<\/code> <code class=\"powershell plain\">=\u00a0\u00a0\u00a0 <\/code><code class=\"powershell functions\">Get-DbaAgReplica<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$lsn<\/code> <code class=\"powershell plain\">| Where Role <\/code><code class=\"powershell operator value\">-eq<\/code> <code class=\"powershell plain\">Primary<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"powershell variable\">$secondaryReplicas<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell functions\">Get-DbaAgReplica<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$lsn<\/code> <code class=\"powershell plain\">| Where Role <\/code><code class=\"powershell operator value\">-eq<\/code> <code class=\"powershell plain\">Secondary<\/code><\/div>\n<div class=\"line number5 index4 alt2\">\u00a0<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"powershell comments\"># primary replica logins<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"powershell variable\">$primaryLogins<\/code> <code class=\"powershell plain\">= (<\/code><code class=\"powershell functions\">Get-DbaLogin<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$primaryReplica<\/code><code class=\"powershell plain\">.Name)<\/code><\/div>\n<div class=\"line number8 index7 alt1\">\u00a0<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"powershell variable\">$secondaryReplicas<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">ForEach-Object<\/code> <code class=\"powershell plain\">{<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments\"># secondary replica logins<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$secondaryLogins<\/code> <code class=\"powershell plain\">= (<\/code><code class=\"powershell functions\">Get-DbaLogin<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$_<\/code><code class=\"powershell plain\">.Name)<\/code><\/div>\n<div class=\"line number12 index11 alt1\">\u00a0<\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$diff<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell variable\">$primaryLogins<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">Where-Object<\/code> <code class=\"powershell plain\">Name<\/code> <code class=\"powershell color1\">-notin<\/code> <code class=\"powershell plain\">(<\/code><code class=\"powershell variable\">$secondaryLogins<\/code><code class=\"powershell plain\">.Name)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell keyword\">if<\/code><code class=\"powershell plain\">(<\/code><code class=\"powershell variable\">$diff<\/code><code class=\"powershell plain\">) {<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell functions\">Copy-DbaLogin<\/code> <code class=\"powershell color1\">-Source<\/code> <code class=\"powershell variable\">$primaryReplica<\/code><code class=\"powershell plain\">.Name<\/code> <code class=\"powershell color1\">-Destination<\/code> <code class=\"powershell variable\">$_<\/code><code class=\"powershell plain\">.Name<\/code> <code class=\"powershell color1\">-Login<\/code> <code class=\"powershell variable\">$diff<\/code><code class=\"powershell plain\">.Nane<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell plain\">}\u00a0\u00a0 <\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"powershell plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Using just the listener name with <a href=\"https:\/\/docs.dbatools.io\/#Get-DbaAgReplica\">Get-DbaAgReplica<\/a> I can get all the replicas by Role, either Primary or Secondary.<br \/>Then I just need to loop through the secondary replicas and call <a href=\"https:\/\/docs.dbatools.io\/#Get-DbaLogin\">Copy-DbaLogin<\/a>.<\/p>\n<p>I use a Central Management Server as an inventory for my SQL servers. I have groups containing only listeners.<\/p>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CMS-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-39910 aligncenter\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/CMS-2.png\" alt=\"CMS\" width=\"171\" height=\"300\" \/><\/a><\/p>\n<p>The list of listeners can be easily retrieved from the CMS with <a href=\"https:\/\/docs.dbatools.io\/#Get-DbaRegServer\">Get-DbaRegisteredServer<\/a>.<\/p>\n<div>\n<div id=\"highlighter_689688\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell variable\">$Listeners<\/code><code class=\"powershell plain\">= <\/code><code class=\"powershell functions\">Get-DbaRegisteredServer<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell string single\">'MyCmsInstance'<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">Where-Object<\/code> <code class=\"powershell plain\">{<\/code><code class=\"powershell variable\">$_<\/code><code class=\"powershell plain\">.Group <\/code><code class=\"powershell operator value\">-Like<\/code> <code class=\"powershell string single\">'*Prod*Listener'<\/code><code class=\"powershell plain\">};<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Now, looping through each listener I can sync dozens of secondary replicas in my SQL Server Prod environment with a single script run.<br \/>I had some issues with instances having multiple availability groups so I added: &#8220;Sort-Object -Unique&#8221;.<br \/>Notice I also filtered out some logins I don&#8217;t want to synchronize.<\/p>\n<div>\n<div id=\"highlighter_216490\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell variable\">$Listeners<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell functions\">Get-DbaRegisteredServer<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell string single\">'MyCmsInstance'<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">Where-Object<\/code> <code class=\"powershell plain\">{<\/code><code class=\"powershell variable\">$_<\/code><code class=\"powershell plain\">.Group <\/code><code class=\"powershell operator value\">-Like<\/code> <code class=\"powershell string single\">'*Prod*Listener*'<\/code><code class=\"powershell plain\">};<\/code><\/div>\n<div class=\"line number2 index1 alt1\">\u00a0<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"powershell keyword\">foreach<\/code> <code class=\"powershell plain\">(<\/code><code class=\"powershell variable\">$lsn<\/code> <code class=\"powershell keyword\">in<\/code> <code class=\"powershell variable\">$Listeners<\/code><code class=\"powershell plain\">) {<\/code><\/div>\n<div class=\"line number4 index3 alt1\">\u00a0<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$primaryReplica<\/code> <code class=\"powershell plain\">=\u00a0\u00a0\u00a0 <\/code><code class=\"powershell functions\">Get-DbaAgReplica<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$lsn<\/code><code class=\"powershell plain\">.ServerName | Where Role <\/code><code class=\"powershell operator value\">-eq<\/code> <code class=\"powershell plain\">Primary | <\/code><code class=\"powershell functions\">Sort-Object<\/code> <code class=\"powershell plain\">Name<\/code> <code class=\"powershell color1\">-Unique<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$secondaryReplicas<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell functions\">Get-DbaAgReplica<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$lsn<\/code><code class=\"powershell plain\">.ServerName | Where Role <\/code><code class=\"powershell operator value\">-eq<\/code> <code class=\"powershell plain\">Secondary | <\/code><code class=\"powershell functions\">Sort-Object<\/code> <code class=\"powershell plain\">Name<\/code> <code class=\"powershell color1\">-Unique<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments here\">&lt;#<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments here\">Some instances have more than 1 AvailabilityGroup<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments here\">=&gt; Added Sort-Object -Unique<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments here\">#&gt;<\/code><\/div>\n<div class=\"line number11 index10 alt2\">\u00a0<\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments\"># primary replica logins<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$primaryLogins<\/code> <code class=\"powershell plain\">= (<\/code><code class=\"powershell functions\">Get-DbaLogin<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$primaryReplica<\/code><code class=\"powershell plain\">.Name<\/code> <code class=\"powershell color1\">-ExcludeFilter<\/code> <code class=\"powershell string single\">'##*'<\/code><code class=\"powershell plain\">,<\/code><code class=\"powershell string single\">'NT *'<\/code><code class=\"powershell plain\">,<\/code><code class=\"powershell string single\">'BUILTIN*'<\/code><code class=\"powershell plain\">, '*<\/code><\/div>\n<div class=\"line number14 index13 alt1\">\u00a0<\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"powershell keyword\">Do<\/code> <code class=\"powershell plain\">not test this script <\/code><code class=\"powershell keyword\">in<\/code> <code class=\"powershell plain\">Production. Try it <\/code><code class=\"powershell keyword\">in<\/code> <code class=\"powershell plain\">a safe environment first, then remove the <\/code><code class=\"powershell string\">\"-WhatIf\"<\/code> <code class=\"powershell keyword\">switch<\/code><code class=\"powershell plain\">.<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"powershell plain\">The next step <\/code><code class=\"powershell keyword\">for<\/code> <code class=\"powershell plain\">me might be to run this script on a schedule. Or even better, trigger the execution after an Availability Group failover?<\/code><\/div>\n<div class=\"line number17 index16 alt2\">\u00a0<\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"powershell plain\">&lt;a href=<\/code><code class=\"powershell string\">\"<a href=\"https:\/\/docs.dbatools.io\/#Get-DbaLogin\">https:\/\/docs.dbatools.io\/#Get-DbaLogin<\/a>\"<\/code> <code class=\"powershell plain\">data-mce-href=<\/code><code class=\"powershell string\">\"<a href=\"https:\/\/docs.dbatools.io\/#Get-DbaLogin\">https:\/\/docs.dbatools.io\/#Get-DbaLogin<\/a>\"<\/code><code class=\"powershell plain\">&gt;<\/code><code class=\"powershell functions\">Copy-DbaLogin<\/code><code class=\"powershell plain\">&lt;\/a&gt; is one of many dbatools commands that can be very useful to synchronize objects between instances. You can find a few examples below.<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<ul>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaAgentJob\">Copy-DbaAgentJob<\/a><\/li>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaCredential\">Copy-DbaCredentials<\/a><\/li>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaLinkedServer\">Copy-DbaLinkedServer<\/a><\/li>\n<li><a href=\"http:\/\/Copy-DbaXESession\">Copy-DbaXESession<\/a><\/li>\n<\/ul>\n<div>\n<div id=\"highlighter_292028\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell plain\">)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code>\u00a0<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$secondaryReplicas<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">ForEach-Object<\/code> <code class=\"powershell plain\">{<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell comments\"># secondary replica logins<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$secondaryLogins<\/code> <code class=\"powershell plain\">= (<\/code><code class=\"powershell functions\">Get-DbaLogin<\/code> <code class=\"powershell color1\">-SqlInstance<\/code> <code class=\"powershell variable\">$_<\/code><code class=\"powershell plain\">.Name<\/code> <code class=\"powershell color1\">-ExcludeFilter<\/code> <code class=\"powershell string single\">'##*'<\/code><code class=\"powershell plain\">,<\/code><code class=\"powershell string single\">'NT *'<\/code><code class=\"powershell plain\">,<\/code><code class=\"powershell string single\">'BUILTIN*'<\/code><code class=\"powershell plain\">, '*<\/code><\/div>\n<div class=\"line number6 index5 alt1\">\u00a0<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"powershell keyword\">Do<\/code> <code class=\"powershell plain\">not test this script <\/code><code class=\"powershell keyword\">in<\/code> <code class=\"powershell plain\">Production. Try it <\/code><code class=\"powershell keyword\">in<\/code> <code class=\"powershell plain\">a safe environment first, then remove the <\/code><code class=\"powershell string\">\"-WhatIf\"<\/code> <code class=\"powershell keyword\">switch<\/code><code class=\"powershell plain\">.<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"powershell plain\">The next step <\/code><code class=\"powershell keyword\">for<\/code> <code class=\"powershell plain\">me might be to run this script on a schedule. Or even better, trigger the execution after an Availability Group failover?<\/code><\/div>\n<div class=\"line number9 index8 alt2\">\u00a0<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"powershell plain\">&lt;a href=<\/code><code class=\"powershell string\">\"<a href=\"https:\/\/docs.dbatools.io\/#Get-DbaLogin\">https:\/\/docs.dbatools.io\/#Get-DbaLogin<\/a>\"<\/code> <code class=\"powershell plain\">data-mce-href=<\/code><code class=\"powershell string\">\"<a href=\"https:\/\/docs.dbatools.io\/#Get-DbaLogin\">https:\/\/docs.dbatools.io\/#Get-DbaLogin<\/a>\"<\/code><code class=\"powershell plain\">&gt;<\/code><code class=\"powershell functions\">Copy-DbaLogin<\/code><code class=\"powershell plain\">&lt;\/a&gt; is one of many dbatools commands that can be very useful to synchronize objects between instances. You can find a few examples below.<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<ul>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaAgentJob\">Copy-DbaAgentJob<\/a><\/li>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaCredential\">Copy-DbaCredentials<\/a><\/li>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaLinkedServer\">Copy-DbaLinkedServer<\/a><\/li>\n<li><a href=\"http:\/\/Copy-DbaXESession\">Copy-DbaXESession<\/a><\/li>\n<\/ul>\n<div>\n<div id=\"highlighter_846665\" class=\"syntaxhighlighter  powershell\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"powershell plain\">)<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code>\u00a0<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell variable\">$diff<\/code> <code class=\"powershell plain\">= <\/code><code class=\"powershell variable\">$primaryLogins<\/code> <code class=\"powershell plain\">| <\/code><code class=\"powershell functions\">Where-Object<\/code> <code class=\"powershell plain\">Name<\/code> <code class=\"powershell color1\">-notin<\/code> <code class=\"powershell plain\">(<\/code><code class=\"powershell variable\">$secondaryLogins<\/code><code class=\"powershell plain\">.Name)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell keyword\">if<\/code><code class=\"powershell plain\">(<\/code><code class=\"powershell variable\">$diff<\/code><code class=\"powershell plain\">) {<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell functions\">Copy-DbaLogin<\/code> <code class=\"powershell color1\">-Source<\/code> <code class=\"powershell variable\">$primaryReplica<\/code><code class=\"powershell plain\">.Name<\/code> <code class=\"powershell color1\">-Destination<\/code> <code class=\"powershell variable\">$_<\/code><code class=\"powershell plain\">.Name<\/code> <code class=\"powershell color1\">-Login<\/code> <code class=\"powershell plain\">(<\/code><code class=\"powershell variable\">$diff<\/code><code class=\"powershell plain\">.Nane)<\/code> <code class=\"powershell color1\">-Whatif<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell plain\">} <\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"powershell spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"powershell plain\">}\u00a0 <\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"powershell plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Do not test this script in Production. Try it in a safe environment first, then remove the &#8220;-WhatIf&#8221; switch.<br \/>The next step for me might be to run this script on a schedule. Or even better, trigger the execution after an Availability Group failover?<\/p>\n<p><a href=\"https:\/\/docs.dbatools.io\/#Get-DbaLogin\">Copy-DbaLogin<\/a> is one of many dbatools commands that can be very useful to synchronize objects between instances. You can find a few examples below.<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaAgentJob\">Copy-DbaAgentJob<\/a><\/li>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaCredential\">Copy-DbaCredentials<\/a><\/li>\n<li><a href=\"https:\/\/docs.dbatools.io\/#Copy-DbaLinkedServer\">Copy-DbaLinkedServer<\/a><\/li>\n<li><a href=\"http:\/\/Copy-DbaXESession\">Copy-DbaXESession<\/a><\/li>\n<\/ul>\n\n\n<p>Written by <a href=\"https:\/\/www.linkedin.com\/in\/steven-naudet-aa540158\/\">Steven Naudet<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The SQL Server environment\u00a0 I worked with today has dozens of SQL Server instances using AlwaysOn Availability Groups for High Availability.When a login is created on the Primary replica of an Availability Group it is not synchronized automatically on secondary replicas. This might cause some issues after a failover (Failed logins). Since this is not [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":14180,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,99],"tags":[1888,2550],"type_dbi":[],"class_list":["post-14179","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","category-sql-server","tag-dbatools","tag-sql-server-2"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>SQL Server: Synchronize logins on AlwaysOn replicas with dbatools - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools\" \/>\n<meta property=\"og:description\" content=\"The SQL Server environment\u00a0 I worked with today has dozens of SQL Server instances using AlwaysOn Availability Groups for High Availability.When a login is created on the Primary replica of an Availability Group it is not synchronized automatically on secondary replicas. This might cause some issues after a failover (Failed logins). Since this is not [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-19T13:47:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-01T09:44:22+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"108\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools\",\"datePublished\":\"2020-05-19T13:47:25+00:00\",\"dateModified\":\"2025-10-01T09:44:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\"},\"wordCount\":460,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\",\"keywords\":[\"dbatools\",\"SQL Server\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"SQL Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\",\"name\":\"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\",\"datePublished\":\"2020-05-19T13:47:25+00:00\",\"dateModified\":\"2025-10-01T09:44:22+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png\",\"width\":300,\"height\":108},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/","og_locale":"en_US","og_type":"article","og_title":"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools","og_description":"The SQL Server environment\u00a0 I worked with today has dozens of SQL Server instances using AlwaysOn Availability Groups for High Availability.When a login is created on the Primary replica of an Availability Group it is not synchronized automatically on secondary replicas. This might cause some issues after a failover (Failed logins). Since this is not [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/","og_site_name":"dbi Blog","article_published_time":"2020-05-19T13:47:25+00:00","article_modified_time":"2025-10-01T09:44:22+00:00","og_image":[{"width":300,"height":108,"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png","type":"image\/png"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools","datePublished":"2020-05-19T13:47:25+00:00","dateModified":"2025-10-01T09:44:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/"},"wordCount":460,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png","keywords":["dbatools","SQL Server"],"articleSection":["Database Administration &amp; Monitoring","SQL Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/","url":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/","name":"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png","datePublished":"2020-05-19T13:47:25+00:00","dateModified":"2025-10-01T09:44:22+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/dbatools.png","width":300,"height":108},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/sql-server-synchronize-logins-on-alwayson-replicas-with-dbatools\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SQL Server: Synchronize logins on AlwaysOn replicas with dbatools"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=14179"}],"version-history":[{"count":2,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14179\/revisions"}],"predecessor-version":[{"id":40587,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/14179\/revisions\/40587"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/14180"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=14179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=14179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=14179"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=14179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}