Назад | Перейти на главную страницу

Копирование учетных записей пользователей NT между серверами

Я создал около 50 учетных записей пользователей на Windows 2003 Server, и я хотел бы скопировать эти учетные записи на новый сервер, возможно ли это? Я не использую Active Directory.

Патрик

Изменить 1: Спасибо за ответы, однако я должен был быть более конкретным в своем первоначальном вопросе. Я хотел бы скопировать учетные записи пользователей и сохранить существующие пароли. Кроме того, я хотел бы скопировать учетные записи между двумя серверами через Интернет и брандмауэрами. Можно ли просто сделать резервную копию и восстановить учетные записи пользователей?

Вот программа VBscript для копирования локальных групп и учетных записей пользователей с исходного компьютера на целевой компьютер:

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

Краткий обзор:

  • Задайте имена SOURCE_COMPUTER и DESTINATION_COMPUTER
  • Установите DEFAULT_PASSWORD (который будет назначен для вновь созданных учетных записей пользователей)
  • Добавьте любые имена локальных групп, которые не должны создаваться на конечном компьютере, в список dictGroupsNotToCreate. MATCH_EXACT означает, что имя группы точно совпадает. MATCH_LEFT означает, что будет сопоставлена ​​только самая левая часть имени группы (т.е. представьте, что после совпадения имени стоит "*").
  • Добавьте в список dictUsersToIgnore LIST любые имена локальных пользователей, которые не должны создаваться на конечном компьютере. MATCH_EXACT и MATCH_LEFT имеют то же значение, что и для списка dictGroupsNotToCreate (т.е. «IUSR_» с MATCH_LEFT означает, что любая учетная запись пользователя, начинающаяся с «IUSR_», не будет создана на конечном компьютере).

Вы должны выполнить этот сценарий с учетными данными, которые имеют права на создание учетных записей на конечном компьютере.

Свойства, скопированные для учетных записей пользователей, по умолчанию перечислены в списке dictPropertiesToCopy. Я выбрал самые распространенные свойства.

Скрипт был достаточно хорошо протестирован, но я не использовал его в производственной среде. Он НЕ вносит никаких изменений в исходный сервер, поэтому вы можете запускать его, не опасаясь повредить исходный сервер.

(Нет, алгоритм группового пополнения ни в малейшей степени неэффективен. Если это вас беспокоит, значит, вы уже знаете достаточно, чтобы его лучше реализовать ...> улыбка <)

Команда «net user» отобразит список всех учетных записей пользователей. Если вы запустите этот канал вывода в файл, вы можете затем отредактировать файл, чтобы преобразовать его в сценарий для создания учетных записей нового сервера. используйте "net help user", чтобы узнать, как создавать учетные записи из командного файла. Вам, вероятно, придется вручную настроить учетные записи после их создания, но это все же экономия времени по сравнению с использованием графического интерфейса.

NB вы не сможете извлечь старые пароли. Если вы не знаете, каковы пароли ваших пользователей, вам придется установить для них какое-то значение по умолчанию, а затем менять их один за другим.

JR

Сообщение Джона только что напомнило мне: есть апплет от MS под названием AddUsers, который помогает с подобными вещами. Видеть http://support.microsoft.com/kb/199878 для подробностей.

Раньше я использовал служебную программу командной строки от Microsoft, которая позволяла сбрасывать учетные записи вместе с хешами паролей в текстовый файл, который затем можно было импортировать на другой компьютер. К сожалению, не могу вспомнить его название.

Вы могли бы дать moveuser из набора ресурсов 2003 попробуйте. Читая, кажется, что он предназначен для перемещения пользователя между доменами, но я могу найти в Google ссылки на его использование для локального -> перемещения домена. Это заставляет меня задаться вопросом, возможен ли и локальный перевод.