Demote the second DC so the third can take over

We have 2 physical W2K3 DCs (2K3A
and 2K3B) in our environment.  The current projects goal is to get these 2 DCs replaced with 2 VMs that run on W2K8(DC upgrade).  What i have done so far.
1. Built the 3rd and 4th 2008 DCs (2K8A and 2K8B) with
2K3A and 2K3B continue to run. At his point yes,we have 4 DCs in the environment.
2. Demote 2K3A and reIP 2K8A with 2K3A's IP.
3. Everything seems ok until when we started to upgrade some member servers to 2008.  The member servers need to retain the old IPs. I believe this is due to slow replication across the domain, i don't know. The newly built member servers do have some
problem to log in. Error such as database error or DC could not be located. However joining to domain is not a problem.
4. Also, the member servers tend to authenticate to DCs from other subnets/geographically location. (I have make sure the subnets were properly defined in AD sites and services)
5. This is very discouraging especially in the middle of the projects with specific time frame.
6. This bring the demotion of 2K3B to a halt. I am playing safe. 
7. However, things seems to fix by itself as time goes by. A few reboot of member servers, it was able to login and authenticate to correct DC.
8. As you can see, this has slow the process quite abit and i was thinking how to prevent this in future. I got another similar project coming up in different sites.
 The question is
1.How should i proceed next to demote 2K3B and reIP 2K8B
without any problems?
2. Any mistakes done so far?
Additional info:
All DCs in the domain are global catalog.
All DCs are DNS servers .

Hello,
have you checked after promoting the new DCs, that SYSVOL/NETLOGON shares exist on them with the same content as on the old ones?
Are all machines configured to use the new DNS servers on the NIC?
For a better overview please upload the following files for review:
ipconfig /all >c:\ipconfig.log [from each DC/DNS Server]
dcdiag /v /c /d /e /s:dcname >c:\dcdiag.log
repadmin /showrepl dc* /verbose /all /intersite >c:\repl.log  ["dc* is a place holder for the starting name of the DCs if they all begin the same (if more then one DC exists)]
dnslint /ad /s "DCipaddress" (http://support.microsoft.com/kb/321045)
ADREPLSTATUS
http://www.microsoft.com/en-us/download/details.aspx?id=30005 can also be exported to file.
As the output will become large, DON'T post them into the thread, please use Windows OneDrive (https://onedrive.live.com) [with open access!]
and add the link from it here. Also the /e in dcdiag scans the complete forest, so better run it on COB.
Best regards
Meinolf Weber
MVP, MCP, MCTS
Microsoft MVP - Directory Services
My Blog: http://blogs.msmvps.com/MWeber
Disclaimer: This posting is provided AS IS with no warranties or guarantees and confers no rights.
Twitter:  

Similar Messages

  • HT1349 I can not run the scanner in my main user, but only the second user and the same thing with updating apps! Why is this happening???

    I can not run the scanner in my main user, but only the second user and the same thing with updating apps! Why is this happening???

    Welcome to the Apple Community.
    Enter the details of her second account at system preferences> mail, contacts & calendars.

  • I signed up for sync on one computer and got a pairing code on the second computer but now I can't bring up the pairing screen on the first computer. Why not?

    I set up sync on the first computer, then got a sync code on the second computer. Now I can't bring up the sync screen on the first computer to sync them together.

    Hi shopper104, <br>
    # Click the Home button (or type about:home in the location bar) to bring up the default Firefox home page.
    # At the bottom of the home page, click the Sync link to open the Sync settings window.
    # Then click the Pair a device link and the Firefox Sync Setup window will open.
    # Enter the twelve character code generated on your other device and click Next.
    # When the code is accepted you will see a Device Connected message and your device will immediately begin syncing. Click Finish to close the setup window.
    <br><br>
    More information can be found in these articles:
    * [[Firefox Sync - Take your bookmarks, tabs and personal information with you]]
    * [[How do I set up Firefox Sync?]]
    * [[How do I add a device to Firefox Sync?]]
    Hope that helped you! Please report back.

  • How can I log into two differant accounts at the same time in two windows without the second window affecting the first.

    I'm trying to log into two facebook accounts at the same time in differant windows. When ever I log into the second account in the second window it changes the login in the first window. When I hit home or any other link the first window account has been logged out and logged into the second window account. I tried installing a second copy of firefox in a differant folder that the first but it seems to use all the files of the first installation. If I can get 2 toatally seperated instalations that don't rely on the same history, cookies, cache, etc I belive that will solve my problem. Please help.
    == User Agent ==
    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.4; OfficeLivePatch.1.3)

    Nah, that won't work. Facebook has a feature that gets your IP Address, so as soon as you sign into one on the same computer, it changes the other login for safety purposes (say, someone was on a public library PC. They forgot to log out. Someone else logs in, and it automatically logs them out). You'll need 2 computers to do that.

  • Hi, I have a refurbished upgraded macbook with 320 GB Disk, 4GB Memory and running Lion OS v 10.7.5.  This satisfies the second part of the requirement for installing OS X Mavericks (10.9) but happens to be an early 2008 piece.  Can I somehow install 10.9

    Hi, I have a refurbished upgraded macbook with 320 GB Disk, 4GB Memory and running Lion OS v 10.7.5.  This satisfies the second part of the requirement for installing OS X Mavericks (10.9) but happens to be an early 2008 piece.  Can I somehow install 10.9?  And why is apple not allowing people like me to try out this installation?  Any reason that are too technical that people like me cannot upgrade and handle?
    This would solve many apps to run on this.

    It's mainly the video card. The Models 2,1 through 4,1 have video cards with non-upgradeable 32bit drivers. The model 5,1 Late 2008 and newer have at least the NVIDIA GeForce 9400M with 64bit drivers. Mountain Lion and Mavericks require 64bit native drivers. Mountain Lion and Mavericks no longer support Intel's GMA 950 or GMA X3100 graphics processors.
    While Lion used some 32 bit and a lot of 64 bit code, Mountain Lion and Mavericks are pure 64 bit, which excludes more systems than Lion did. It's not something you can add memory to, for example, as it involves the base architecture.
    http://reviews.cnet.com/8301-13727_7-57470261-263/older-64-bit-macs-out-of-the-p icture-for-mountain-lion/?tag=mncol;txt
      http://reviews.cnet.com/8301-13727_7-57387846-263/will-your-mac-run-mountain-lio n/   

  • TS1292 My husband took the sticker of the Itunes gift card off!  Yes, he could not scratch it, so he took 1/2 of it off!  Now I can not read the second portion of the card.  HELP

    Yes, he could not scratch it, so he took 1/2 of it off!  Now I can not read the second portion of the card.  HELP

    What, another dumb husband?!?
    Tell him to read this document: iTunes Store: Invalid, inactive, or illegible codes

  • Closing the Second instance of the browser.

    Hello,
    I am working on a project written in Java. When applet is running in Browser, we can open the new instance of the browser using File->window->new (or pressing CTR-N). Since the second window runns in the context of first window, It is causing some problem.
    Is there any way for me to close the second instance of the browser from my Java applet?? If not is there any way for me to disable both the File->new->Window and CTR-N options.
    I am new to java and java script. If it is not possible in Java Applet, is it possible in java Script. Please Provide me with full information.
    Thanks and Regards,
    Ratna.

    Hi,
    There is no way you can close the browser window that the user opens. Even if there is a way through some hack, it will not completely give u a solution, independant of browsers and all. And moreover it is not advisable to restrict the user like that.
    A more elegant way would be to handle it in the server side. I can give u one ligical way. U can make the page expire as soon as it gets loaded. U can do that by using the code below. And you have to have a server side function to check for a request from the same client machine for the same page.
    <%
        if (request.getProtocol().compareTo("HTTP/1.0") == 0)
            response.setHeader("Pragma", "no-cache");
        else if (request.getProtocol().compareTo("HTTP/1.1") == 0)
            response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Expires", "-1");
    %>So when the user opens a new browser window, he will be shown page expired message, or the page will be requested again from the server. U can have a map storing the remote address and the session of the user.

  • TS1702 We use one ID for  the Apps store for 2 iPhones. In the second profile on the Macit is impossible to update apps there is a mistake. What is the decision?

    We use one ID for  the Apps store for 2 iPhones. In the second profile on the Macit is impossible to update apps there is a mistake. What is the decision?

    This happens when you both use the same Apple ID for iMessage.  To fix this you have two choices:
    On one of the phones go to Settings>Messages>Send & Receive, tap the ID, sign out, then sign back in with a different ID.  Note: you can still share the same ID for purchasing in Settings>iTunes & App Stores; or
    On both phones go to Settings>Messages>Send & Receive and uncheck the email address(es) shown under "You can be reached by iMessage at".  Also uncheck the other phone's phone number, if present.

  • How to call the second mapping in the first mapping fails in the BPM

    Hi All,
    I have a scenario like this.
    There are two mappings. There is a one condition while genearying the root element of the first mapping. If this condition is not satisfies the first mapping will fail. If this mapping fails i want to trigger another mapping.
    How to achieve this functionality.
    If it is possible with BPM. how to call the second mapping in the BPM.

    Hi
    you can not create the containter for the synchronous interfaces.
    you have to craete the two asysnchronous abstact interfaces .
    thenusing those two abstract interfaces you have to define the containers in the BPM.
    and you also have to define the interface mapping b/w those two abstract interfaces.
    once you define the interface mapping you will be able to select the interface mapping using the transformation step in BPM.
    once you select the interface mapping in BPM then you will be able to selece the interfaces
    if you still face the problenm please reply me back.
    Thanks
    Rinku Gangwnau

  • I'm trying to set up a dual monitor for my new iMac. I'm using a second display I used with my old G5. My iMac recognizes the second monitor but the monitor won't turn on. Power button doesn't do anything on the monitor itself.

    I'm trying to set up a dual monitor for my new iMac. I'm using a second display I used with my old G5. My iMac recognizes the second monitor but the monitor won't turn on. Power button doesn't do anything on the monitor itself.

    If it won't turn on then the monitor is dead (power supply?, video circuits?).  Not worth repairing.
    If you have a new iMac then it has thunderbolt.  So exactly what is that monitor you are trying to connect?  For TB you can connect a mini-displayport monitor.   Probably (not 100% sure with TB) can use dvi or vga too if you have the appropriate adapter.

  • Hi all, how to check the second copy in the smartform

    HI all,
          I must print the text 'Duplicate Copy' in the second time printing document in the smarrform, i how can i check whether the pages that are given for printing and which one is the first copy of printing and which one is the second copy of printing.
    Can any one give the answer for this.
    Thanks,
    Ravi Kumar

    Hi Ravi,
                You have to make use of <b>Alternative</b> node. Keeping your window name selected, right click, Create -> Flow Logic -> Alternative.
    <b>%CONDITION</b> will be created under the window. In this <b>%CONDITION</b>,  <b>General Attributes</b> tab,  give
    <b> 
    Field Name                                    Comparison Value
    SFSY-COPYCOUNT             =                       2
    </b>
    Under <b>%CONDITION1</b>, under <b>True</b>, create a <b>text</b> (%text1) node, in that write <b>Duplicate Copy</b>. This text <b>Duplicate Copy</b> will only be printed if you take the printout for the second time.
    Hope it helps!
    Regards,
    Abdul
    P.S: Reward points, if useful!

  • Why is the second row in the recordset not updated?

    Hi,
    I have this problem.
    I have written a servlet named processPOItem.
    The following is the doPost Method in the processPOItem class:
    public class processPOItem extends HttpServlet {
    //attributes
    public String strPO;
    ConnectionPool connectionPool = null;
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, java.io.IOException {
            int counter=0, remainder=0;
            String SearchPOItems;
            String strStatus, ISBN;
            String price;
            response.setContentType("text/html"); //html output
            PrintWriter out = response.getWriter();
            //get the parameter named PO
            strPO = request.getParameter("PO");
            Connection dbConn = null;
            try{  
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Purchase Order " + strPO + "</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<table width=600 border=0 align=center>");
                out.println("<tr>");
                out.println("<td colspan=4 align=center>");
                out.println("<font face=Arial size=2>");
                out.println("<b>Purchase Order: " + strPO + "</b>");
                out.println("</font>");
                out.println("</td>");
                out.println("</tr>");
                out.println("</table>");
                out.println("<form method=post action=processPOItem>");
                out.println("<input name=updatePO type=hidden value=1>");  
                out.println("<table width=800 border=0 cellspacing=1 cellpadding=0 align=center>");
                out.println("<tr bgcolor=\"#990000\">"); //Display the mb_PurchaseItem
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">No</font></b></td>");
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">ISBN</font></b></td>");
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">Title</font></b></td>");
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">Status</font></b></td>");
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">Quantity</font></b></td>");
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">Unit Price</font></b></td>");
                out.println("<td align=center><b><font size=1 face=Verdana color=\"#FFFFFF\">Delivered Date</font></b></td>");
                out.println("</tr>");
                //get the SQL statement
                SearchPOItems = searchSQL(strPO);
                //get free connection from Pool
                dbConn = connectionPool.getConnection();
                //create a statement object
                Statement stmt = dbConn.createStatement();
                //create the recordset
                ResultSet rs = stmt.executeQuery(SearchPOItems);
                //display the recordset
                while (rs.next())
                    counter++;
                    remainder = counter % 2;
                    if (remainder == 0)
                       out.println("<tr bgcolor=\"#C1C1C1\">");
                    else
                       out.println("<tr bgcolor=\"#E1E1FF\">");
                    //Display the individual Purchase item under the customer
                    out.println("<td align=center><font size=1 face=Verdana>" + counter + "</font></td>");
                    ISBN = rs.getString("mb_ISBN");
                    out.println("<td align=center><font size=1 face=Verdana>" + ISBN + "</font></td>");
                    out.println("<td align=center><font size=1 face=Verdana>" + rs.getString("mb_Title") + "</font></td>");
                    strStatus = rs.getString("mb_Status");
                    out.println("<td align=center><font size=1 face=Verdana>");
                    out.println("<select name=\"mb_Status" + ISBN + "\">");
                    out.println("<option value=PENDING");
                    if (strStatus.equals("PENDING"))
                       out.println("selected>Pending</option>");
                    else  
                       out.println(">Pending</option>");
                    out.println("<option value=PROCESSING");
                    if (strStatus.equals("PROCESSING"))
                       out.println("selected>Processing</option>");
                    else  
                       out.println(">Processing</option>");               
                    out.println("<option value=DELIVERED");
                    if (strStatus.equals("DELIVERED"))
                       out.println("selected>Delivered</option>");
                    else  
                       out.println(">Delivered</option>");
                    out.println("<option value=CANCELLED");
                    if (strStatus.equals("CANCELLED"))
                       out.println("selected>Cancelled</option>");
                    else  
                       out.println(">Cancelled</option>");
                    out.println("</select>");
                    out.println("</font>");      
                    out.println("</td>");
                    out.println("<td align=center><font size=1 face=Verdana>" + rs.getString("mb_Qty") + "</font></td>");
                    /*price = rs.getString("mb_Price");
                    NumberFormat moneyAmount = NumberFormat.getCurrencyInstance();
                    Double dPrice = Double.parseDouble(price);
                    out.println("<td align=center><font size=1 face=Verdana>" + rs.getString("mb_Price") + "</font></td>");
                    out.println("<td align=center colspan=2><font size=1 face=Verdana>");
                    if (strStatus.equals("DELIVERED"))
                        //status = "DELIVERED"
                        out.println("<input align=center name=\"deliveredDate" + ISBN + "\" type=text size=10 maxlength=10 value=" + rs.getString("mb_DeliveredDate") + ">");    
                    else
                        out.println("<input align=center name=\"deliveredDate" + ISBN + "\" type=text size=10 maxlength=10 value=Nil disabled>");
                    out.println("</font>");   
                    out.println("</td>");
                    out.println("</tr>");
                out.println("<tr><td> </td></tr>");
                out.println("<TR>");
                out.println("<TD colspan=3 align=center>");
                out.println("<INPUT TYPE=submit BORDER=1 value=update name=update>");
                out.println("</td>");
                out.println("<TD colspan=3 align=center>");
                out.println("<a href=\"javascript:window.close()\"><img src=\"Close.gif\" BORDER=0></a>");
                out.println("</td>");
                out.println("</tr>");
                out.println("<tr>");
                rs.close();  
                stmt.close();
                out.println("</form>");
                out.println("</table>");
                out.println("</body>");
                out.println("</html>");
                out.close();
            catch (Exception e)
                //sendErrorToClient(out, e); //send stack trace to client
                System.out.println(e.getMessage());
            finally{
                //return connection to Pool
                connectionPool.returnConnection(dbConn);
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, java.io.IOException {
               response.setContentType("text/html"); //html output
               PrintWriter out = response.getWriter();
               Connection dbConn = null;
               //get the parameters posted back by processPOItem servlet
               String processingAll = request.getParameter("processingAll");
               String deliveredAll = request.getParameter("deliveredAll");
               String deliveredDate = request.getParameter("deliveredDate");
               String refInvoice = request.getParameter("refInvoice");
               String refNumber = request.getParameter("refNumber");
               //String status = request.getParameter("status");  
               //check if update button is pressed
               String updatePO = request.getParameter("updatePO");
               //sql statement variable
               String sqlUpdatePOStatus;
               String isbn, poItemStatus;
               //update button was pressed
               if (!updatePO.equals(""))
                try{
                    //get the SQL statement
                    String SearchPOItems = searchSQL(strPO);
                    //get free connection pool
                    dbConn = connectionPool.getConnection();
                    //create a statement object
                    Statement stmt = dbConn.createStatement();
                    //create the recordset
                    ResultSet rs = stmt.executeQuery(SearchPOItems);
                    int index = 0;
                    //display the recordset
                    while (rs.next())
                      isbn = rs.getString("mb_ISBN");
                      poItemStatus = request.getParameter("mb_Status" + isbn);
                      out.println(isbn + " " + poItemStatus);
                      out.println("<br>");
                      //update the status of individual PO item
    if (!poItemStatus.equals(""))
    sqlUpdatePOStatus = updatePOItemSQL(strPO, isbn, poItemStatus);
    stmt.executeUpdate(sqlUpdatePOStatus);
                    rs.close();  
                    stmt.close();
                    out.close();
                catch (Exception e)
                    System.out.println(e.getMessage());
                finally{
                        //return connection to pool
                        connectionPool.returnConnection(dbConn);
    }When I perform a form submit in my doGet() method, the doPost Method() responsed. However, it encounter error in updating the second row in the recordset as highlighted in bold.
    After the first row is updated. The second row did not get updated at all.
    The error return was "Resultset is closed".
    What actually is wrong? How can I execute a sqlstatement inside a recordset? How to solve this problem?

    Did you turn on the "updatable" switch for the result
    set?
    public Statement createStatement(int resultSetType,
    int resultSetConcurrency) throws
    SQLException
    Parameters:
    resultSetType - a result set type; see
    ResultSet.TYPE_XXX
    resultSetConcurrency - a concurrency type; see
    ResultSet.CONCUR_XXX
    static int CONCUR_UPDATABLE
    JDBC 2.0 The concurrency mode for a ResultSet object
    that may be updated.Hi,
    do you refer to the following change of code:
    //create a statement object (original)
    Statement stmt = dbConn.createStatement();change to the following:
    //create a statement object (original)
    Statement stmt = dbConn.createStatement(resultSetType,
    resultSetConcurrency);when I use another statement object for executeupdate, what I got was the connection was used by another hstmt. Thus the second column was not updated at all.
    Why?

  • In Pages, the column in the table won't flow onto the second page. The text is hidden. Please help!

    In Pages, the column in the table won't flow onto the second page. The text is hidden. Please help!

    Thank you for your reply,
    When I click 'view' , I can "show inspector". From the table tab, I can pull up the "Format". [See below]. I don't see the "Arrange" or "Object Placement Move with Text"
    Right now I have the Wrap Text On. When I take it off, It messes up my rows [see second image].
    All I want is for my column to flow onto the second page.
    Your assistance is genuinely appreciated.
    Thank you again.

  • Locking Periods using the Second Hierarchy in the Time Dimension

    Hi,
    They are not usiing work status for this...
    I am at a client, and they used the second hierarchy in the time dimension to lock periods.  If they left the second hierarchy blank, no data can be written to it.  To open the open the period, they code the Second Heirarchy with CONS_OPEN.  Just wondering if anyone has information on this? 
    It was working fine, then we needed to run a transport to move BPC to a new machine, and it stopped working.  Not sure if anyone has done it this way before?
    Thanks,
    Chandra

    Dear Kacper,
    the way I understood, there are two separate questions in this post, namely:
    I'm using a shared resource in multiple actors, and the code accessing the resource can take quite some time to execute. How can can I ensure this does not mess up the timing of one or all accessors?
    I'm using a shared resource in multiple actors, and the code accessing the resource can generate errors if I try to access it from multiple places. How can I ensure synchronization between all accessors?
    As for the first question, the optimal solution to separate the resource prone to timing issues in a different thread/actor. Put anything that is not strictly timed (file access, network comunication) in a separate loop. For each actor, you will get queue references to communicate with, so instead of logging the measurements in the actors where they are made, just queue them up for a different loop to process.
    For the second part, the same logic still applies. Ideally, every singular resource should be handled by its own thread and nowhere else, so if anything else needs data from/to said resource, it can send a request to the dedicated thread or actor.
    If, for some reason, this is not sufficient, you have to handle synchronization in some other way. There are a lot of techniques here, for example:
    Create a named semaphore or lock as a part of the class. Have class functions use the semaphore before accessing the resource.
    Use actor messages. Have a "resource in use" or "resource released" messages sent to all users whenever obtaining or releasing said resource.
    Have a separate actor handle all resources, awarding them to threads needing them. This method also allows setting priorities between requests.
    These are just a few examples, there are many other options.
    Please let me know if this was helpful. 
    Kind regards:
    Andrew Valko
    National Instruments Hungary

  • I want to write a script or Automator workflow/app that emails a random shortcut of the day to three recipients. The source is from an Excel spreadsheet. One column is the shortcut, and the second column is the definition. Anyone have experience?

    I want to write a script or Automator workflow/app that automatically emails a random shortcut of the day to three recipients. The source is from an Excel spreadsheet. One column is the shortcut, and the second column is the definition. Anyone have similar experience and know that this would work?

    I have had a first stab at the script, below.  It uses a file to store the shortcuts and command [descriptions].  You should be able to see from the script annotations how to add a new one.  (I populated 1-4 with real data, but got lazy after that, so you have a few placeholders to work with first.
    As I have noted, once you are happy that you have all the data in the file, you can comment out part of the script for ongoing use.  (BTW, my reluctance to use Excel is that I don't currently have it installed and I don't want to offer wrong advice.  If you have Numbers, I do have that and could probably modify to work with a spreadsheet from there.  This might be especially useful if you have the data already sitting in Excel.)
    A few things came-up whilist I was writing the script:
    1.     Currently, all recipients will not only get the same tip at the same time, but they will see the names and email addresses of the others who receive them.  It is possible to modify this.
    2.     I have added a property gRandomCheck which keeps track of which shortcut has already been used (since the last time the script was compiled.  This will prevent the same tip being sent more than once.    When all tips have been sent once, the script will alert you and not send anything until reset.  It does not check on a per-addressee basis (which would be a refinement).  (If you add a new addressee at this stage, the whole process will start again, and you may not really want this to be the behaviour.)
    3.     The way that I have built the list, commandList, is deliberately cumbersome - it's for the sake of clarity.  If you prefer, you can construct the whole list as {{shortcut:"X", command:"X"}, {shortcut:"Y", command:"Y"}}
    Have a look - I am sure you will have questions!
    SCRIPT STARTS HERE  Paste the following lines (thru the end) into a new AppleScript Editor document and press RUN
    --The property gRandomCheck persists between runs and is used to stop sending the same hint twice.
    property gRandomCheck : {}
    --I am defining a file on the desktop.  It doesn't have to be in this location
    set theFolder to path to desktop
    set commandFile to (theFolder as text) & "CommandFile.csv"
    --(* Unless you need to change the file contents you do not need to write to it each time.  Remove the "--" on this line and before the asterisk about 18 lines below
    --Follow this format and enter as many records as you like on a new line - each with a unique name
    set record1 to {shortcut:"Z", command:"Undo"}
    set record2 to {shortcut:"R", command:"Record"}
    set record3 to {shortcut:"⇧R", command:"Record Toggle"}
    set record4 to {shortcut:"⌘.", command:"Discard Recording & Return to Last Play Position"}
    set record5 to {shortcut:"X", command:"x"}
    set record6 to {shortcut:"X", command:"x"}
    set record7 to {shortcut:"X", command:"x"}
    set record8 to {shortcut:"X", command:"x"}
    set record9 to {shortcut:"X", command:"x"}
    set record10 to {shortcut:"X", command:"x"}
    set record11 to {shortcut:"X", command:"x"}
    set record12 to {shortcut:"X", command:"x"}
    set record13 to {shortcut:"X", command:"x"}
    --Make sure you add the record name before randomCheck:
    set commandList to {record1, record2, record3, record4, record5, record6, record7, record8, record9, record10, record11, record12, record13}
    --This part writes the above records to the file each time.
    set fileRef to open for access commandFile with write permission
    set eof of fileRef to 0
    write commandList to fileRef starting at eof as list
    close access fileRef
    --remove "--" here to stop writing (see above)*)
    --This reads from the file
    set fileRef to open for access commandFile with write permission
    set commandList to read fileRef as list
    close access fileRef
    --Here's where the random record is chosen
    set selected to 0
    if (count of gRandomCheck) is not (count of commandList) then
              repeat
                        set selected to (random number from 1 to (count of commandList))
                        if selected is not in gRandomCheck then
                                  set gRandomCheck to gRandomCheck & selected
                                  exit repeat
                        end if
              end repeat
    else
              display dialog "You have sent all shortcuts to all recipients once.  Recompile to reset"
              return
    end if
    --This is setting-up the format of the mail contents
    set messageText to ("Shortcut: " & shortcut of record selected of commandList & return & "Command: " & command of record selected of commandList)
    tell application "Mail"
      --When you're ready to use, you probably will not want Mail popping to the front, so add "--" before activate
      activate
      --You can change the subject of the message here.  You can also set visible:true to visible:false when you are happy all is working OK
              set theMessage to (make new outgoing message with properties {visible:true, subject:"Today's Logic Pro Shortcut", content:messageText})
              tell theMessage
      --You can add new recipients here.  Just add a new line.  Modify the names and addresses here to real ones
                        make new to recipient with properties {name:"Fred Smith", address:"[email protected]"}
                        make new to recipient with properties {name:"John Smith", address:"[email protected]"}
      --When you are ready to start sending, remove the dashes before "send" below
      --send
              end tell
    end tell

Maybe you are looking for