Copiar contas de usuários NT entre servidores

2

Criei cerca de 50 contas de usuário em um servidor Windows 2003 e gostaria de copiá-las para um novo servidor. Isso é possível? Eu não estou usando o Active Directory.

Patrick

Editar 1: Obrigado pelas respostas, mas eu deveria ter sido mais específico na minha pergunta original. Eu gostaria de copiar as contas de usuário e manter as senhas existentes. Além disso, gostaria de copiar as contas entre dois servidores na Internet e firewalls. É possível simplesmente fazer backup e restaurar contas de usuário?

    
por Patrick J Collins 30.06.2009 / 14:04

4 respostas

1

O comando "net user" exibirá uma lista de todas as contas de usuários. Se você executar isso, canalize a saída para um arquivo e edite o arquivo para convertê-lo em um script para criar as contas do novo servidor. use "net help user" para ver como criar contas a partir de um arquivo de lote. Você provavelmente terá que fazer alguns ajustes manuais das contas depois de criá-las, mas ainda é uma economia de tempo comparado ao uso da GUI.

NB você não será capaz de extrair as senhas antigas. Se você não souber quais são as senhas dos seus usuários, terá que definir todas elas para algum valor padrão e, em seguida, alterá-las uma a uma.

JR

A postagem de John acaba de me lembrar: há um applet da MS chamado AddUsers que ajuda com esse tipo de coisa. Consulte o link para obter detalhes.

    
por 30.06.2009 / 14:20
1

Aqui está um programa VBscript para copiar grupos locais e contas de usuário de um computador de origem para um computador de destino:

Option Explicit

Dim dictGroupsNotToCreate, dictPropertiesToCopy, dictUsersToIgnore, objNetwork
Dim colSourceGroups, colDestinationGroups, objSourceGroup, objDestinationGroup, objUser
Dim colSourceAccounts, colDestinationAccounts, objSourceUser, objDestinationUser, property

' Debugging
Const DEBUGGING = True

' Source and destination computers
Const SOURCE_COMPUTER = "PC00623"
Const DESTINATION_COMPUTER = "PC00619"

' Password to set on newly create user accounts
Const DEFAULT_PASSWORD = "rh1n0s!!!"

' Constants for comparison of accounts to ignore list
Const MATCH_EXACT = 1
Const MATCH_LEFT = 2

Set dictGroupsNotToCreate = CreateObject("Scripting.Dictionary")
dictGroupsNotToCreate.Add "Administrators", MATCH_EXACT
dictGroupsNotToCreate.Add "Backup Operators", MATCH_EXACT
dictGroupsNotToCreate.Add "Guests", MATCH_EXACT
dictGroupsNotToCreate.Add "Network Configuration Operators", MATCH_EXACT
dictGroupsNotToCreate.Add "Power Users", MATCH_EXACT
dictGroupsNotToCreate.Add "Remote Desktop Users", MATCH_EXACT
dictGroupsNotToCreate.Add "Replicator", MATCH_EXACT
dictGroupsNotToCreate.Add "Users", MATCH_EXACT
dictGroupsNotToCreate.Add "Debugger Users", MATCH_EXACT
dictGroupsNotToCreate.Add "HelpServicesGroup", MATCH_EXACT

' Properties of user accounts to copy
Set dictPropertiesToCopy = CreateObject("Scripting.Dictionary")
dictPropertiesToCopy.Add "Description", True
dictPropertiesToCopy.Add "FullName", True
dictPropertiesToCopy.Add "HomeDirDrive", True
dictPropertiesToCopy.Add "HomeDirectory", True
dictPropertiesToCopy.Add "LoginHours", True
dictPropertiesToCopy.Add "LoginScript", True
dictPropertiesToCopy.Add "Profile", True

' Accounts to ignore during copying
Set dictUsersToIgnore = CreateObject("Scripting.Dictionary")
dictUsersToIgnore.Add "SUPPORT_", MATCH_LEFT
dictUsersToIgnore.Add "IUSR_", MATCH_LEFT
dictUsersToIgnore.Add "IWAM_", MATCH_LEFT
dictUsersToIgnore.Add "Administrator", MATCH_EXACT
dictUsersToIgnore.Add "Guest", MATCH_EXACT
dictUsersToIgnore.Add "HelpAssistant", MATCH_EXACT
dictUsersToIgnore.Add "ASPNET", MATCH_EXACT

' Should this account be ignored
Function IgnoreObject(Name, dictNames)
    Dim strToIgnore

    IgnoreObject = False

    For Each strToIgnore in dictNames

        ' Match Exact
        If (dictNames.Item(strToIgnore) = MATCH_EXACT) and (UCase(Name) = UCase(strToIgnore)) Then
            IgnoreObject = True
            Exit Function
        End If

        ' Match left
        If (dictNames.Item(strToIgnore) = MATCH_LEFT) and (Left(UCase(Name), Len(strToIgnore)) = UCase(strToIgnore)) Then
            IgnoreObject = True
            Exit Function
        End If

    Next' strToIgnore
End Function

Set objNetwork = CreateObject("Wscript.Network")

' Get groups on source computer and loop through them, copying as necessary
Set colSourceGroups = GetObject("WinNT://" & SOURCE_COMPUTER)
Set colDestinationGroups = GetObject("WinNT://" & DESTINATION_COMPUTER)
colSourceGroups.Filter = Array("group")

For Each objSourceGroup in colSourceGroups

    If IgnoreObject(objSourceGroup.Name, dictGroupsNotToCreate) = False then
        If (DEBUGGING) Then WScript.Echo "Creating Group: " & objSourceGroup.Name
        Set objDestinationGroup = colDestinationGroups.Create("group", objSourceGroup.Name)
        objDestinationGroup.Put "Description", objSourceGroup.Get("Description")
        objDestinationGroup.SetInfo
    Else
        If (DEBUGGING) Then WScript.Echo "Ignoring Group: " & objSourceGroup.Name
    End If
Next ' objSourceGroup

' Get accounts on source computer and loop through them, copying as necessary
Set colSourceAccounts = GetObject("WinNT://" & SOURCE_COMPUTER)
set colDestinationAccounts = GetObject("WinNT://" & DESTINATION_COMPUTER)
colSourceAccounts.Filter = Array("user")
For Each objSourceUser In colSourceAccounts

    If IgnoreObject(objSourceUser.Name, dictUsersToIgnore) = False Then
        If (DEBUGGING) Then WScript.Echo "Copying account: " & objSourceUser.Name

        On Error Resume Next

        Set objDestinationUser = colDestinationAccounts.Create("user", objSourceUser.Name)
        objDestinationUser.SetPassword DEFAULT_PASSWORD
        objDestinationUser.SetInfo

        ' Copy properties from source user to destination user
        For Each property in dictPropertiesToCopy
            If (DEBUGGING) then WScript.Echo "   Copying property " & property & " (" &  objSourceUser.Get(property) & ")"
            objDestinationUser.Put property, objSourceUser.Get(property)
            objDestinationUser.SetInfo
        Next ' property

        ' Put user into destination groups
        For Each objSourceGroup In colSourceGroups
            For Each objUser In objSourceGroup.Members
                If UCase(objUser.Name) = Ucase(objSourceUser.Name) Then 
                    If (DEBUGGING) Then WScript.Echo "Adding user " & objSourceUser.Name & " to group " & objSourceGroup.Name
                    Set objDestinationGroup = GetObject("WinNT://" & DESTINATION_COMPUTER & "/" & objSourceGroup.Name & ",group")
                    objDestinationGroup.Add(objDestinationUser.aDSPath)
                Else
                    If (DEBUGGING) Then WScript.Echo "User " & objSourceUser.Name & " is not a member of group " & objSourceGroup.Name
                End If
            Next ' objUser
        Next 'objSourceGroup

    Else
        If (DEBUGGING) Then WScript.Echo "Ignoring account: " & objSourceUser.Name
    End If
Next ' objSourceUser

Um tour rápido:

  • Defina os nomes SOURCE_COMPUTER e DESTINATION_COMPUTER
  • Defina a DEFAULT_PASSWORD (que será atribuída às contas de usuário recém-criadas)
  • Adicione nomes de grupos locais que não devem ser criados no computador de destino à lista dictGroupsNotToCreate. MATCH_EXACT significa que o nome do grupo é correspondido exatamente. MATCH_LEFT significa que apenas a parte mais à esquerda do nome do grupo será correspondida (por exemplo, imagine que a correspondência de nome tenha um "*" depois disso).
  • Adicione nomes de usuários locais que não devem ser criados no computador de destino à lista dictUsersToIgnore. MATCH_EXACT e MATCH_LEFT têm os mesmos significados que com a lista dictGroupsNotToCreate (ou seja, "IUSR_" com MATCH_LEFT significa que qualquer conta de usuário que comece com "IUSR_" não será criada no computador de destino).

Você deve executar esse script com credenciais que têm direitos para criar contas no computador de destino.

As propriedades copiadas para contas de usuários, por padrão, são listadas na lista dictPropertiesToCopy. Eu escolhi as propriedades mais comuns.

O script foi testado razoavelmente bem, mas eu não o usei em um ambiente de produção. Ele NÃO faz alterações no servidor de origem, portanto você pode executá-lo sem medo de danificar seu servidor de origem.

(Não, o algoritmo da população do grupo não é eficiente nem um pouco. Se isso incomoda você já sabe o suficiente para reimplementá-lo melhor ... > smile <)

    
por 30.06.2009 / 14:13
0

Em tempos passados, eu usei um utilitário de linha de comando da Microsoft que permitia que você despejasse as contas, completas com hashes de senha, em um arquivo de texto que poderia ser importado em outra máquina. Infelizmente, não consigo lembrar o nome dele.

    
por 30.06.2009 / 14:35
0

Você pode dar moveuser do 2003 Resource Kit uma tentativa. Através da leitura, parece ser projetado para mover um usuário entre domínios, mas posso fazer referências ao Google que estão sendo usadas para locais - > movimentos de domínio. Me faz pensar se um local para o local também é possível.

    
por 30.06.2009 / 15:58