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 <)