Directorio Activo, Actualizar campos en una misma ficha de usuario

Buenas

Resulta que en el curro, en el Teams, cuando vas a ver los datos de contacto de un usuario, hay algunos que les aparece el teléfono y otros no. Eso es debido que al crearles la ficha en el "Active Directory", no han rellenado el campo "Numero de Telefono", y lo han añadido en el campo "notas" de la "pestaña teléfonos".

Imagen

Aunque no tengo ni idea de esto :-? , me han pedido que mire haber como hacer para que el teléfono que aparezca en el campo notas, lo copie al campo "Numero de telefono"

Imagen

Un compañero me a dicho que mire módulos para interactuar con Active Directory en Power Shell.

Alguien podría echarme una mano y decirme si ¿se puede hacer directamente sobre el Active Directory, o habría que exportar los datos a un excel, word, actualizar ahi los datos y volver a subirlos al Active Directory.?

Independientemente de la forma de hacerlo, ¿Como leches se hace?

Gracias
Saludos
Buenas.

Puedes hacer un script de Powershell para copiar de un campo a otro.

Si lo tienes organizado por unidades organizativas mucho mejor, yo en el curro tengo algunas tareas que hacen esto periodicamente para un tema de grupos dinamicos con Azure que tengo que andar copiando campos, y funciona perfectamente.

Si tienes Copilot pídele que te haga el script y luego lo pones tus datos de dominio.
Hola.

Gracias por contestar @KKnot

Poniendo este texto en Copiltot:

en el directorio activo, copiar los datos del campo notas de todos los usuarios, al campo teléfono de los mismos usuarios de forma automática a través de módulos para powershell. Solicitar en que unidad organizativa empezar el proceso. Que este todo en un solo script

Sale lo siguiente:


# Solicitar la unidad organizativa (OU)
$ou = Read-Host -Prompt "Ingrese la unidad organizativa (OU) donde desea comenzar el proceso (ejemplo: OU=Usuarios,DC=dominio,DC=com)"

# Obtener todos los usuarios en la OU especificada
$users = Get-ADUser -Filter * -SearchBase $ou -Properties Info, TelephoneNumber

# Copiar los datos del campo 'Notas' al campo 'Teléfono' para cada usuario
foreach ($user in $users) {
if ($user.Info) {
Set-ADUser -Identity $user.SamAccountName -TelephoneNumber $user.Info
Write-Host "Actualizado el usuario: $($user.SamAccountName)"
} else {
Write-Host "El usuario $($user.SamAccountName) no tiene datos en el campo 'Notas'."
}
}
Write-Host "Proceso completado."


¿Como lo ves, @KKnot ?

Gracias

Saludos
@exray Podria valer, te dejo yo uno mas corto que hace lo mismo:

$users = get-aduser -Server "tuservidordedominio.com" -SearchBase "OU=USUARIOS,DC=tudominio,DC=com" -Filter * -Properties *|Where-Object {$_.info -ne $null }| Select-Object Samaccountname,telephoneNumber

foreach($user in $users)
{
set-aduser -server "tuservidordedominio.com" -identity $user.Samaccountname -add @{telephoneNumber=$user.info}
}

Hace lo mismo, sustituyes por tu nombre de controlador de dominio, luego la unidad organizativa donde tengas los usuarios, y si el campo notas no está vacío, lo copia al campo de teléfono de cada usuario.

Ya me dirás si te sirve.
Buenas

Gracias por el aporte @KKnot .

Cuando lo hayan probado te digo.

Saludos
Hola.

El informático me a dicho, que en vez de hacerlo directamente, primero sacar un excel para ver como está la información.

En el Copilot, he puesto:

a través de powershell, exportar a un Excel del directorio activo, de la pestaña general, los campos nombre, apellido, y número de teléfono. De la pestaña teléfonos, los campos domicilio, móvil y notas. Solicitar en que unidad organizativa empezar el proceso. Todo en un script.

# Importar el módulo de Active Directory
Import-Module ActiveDirectory

# Solicitar la unidad organizativa (OU) al usuario
$ou = Read-Host "Introduce la ruta de la Unidad Organizativa (OU) desde la que deseas comenzar el proceso"

# Obtener los usuarios del directorio activo en la OU especificada
$users = Get-ADUser -Filter * -SearchBase $ou -Property GivenName,Sn,TelephoneNumber,HomePhone,Mobile,info

# Crear un nuevo objeto Excel
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Add()
$worksheet = $workbook.Worksheets.Item(1)

# Escribir los encabezados en la primera fila
$worksheet.Cells.Item(1, 1).Value = "Nombre"
$worksheet.Cells.Item(1, 2).Value = "Apellido"
$worksheet.Cells.Item(1, 3).Value = "Número de Teléfono"
$worksheet.Cells.Item(1, 4).Value = "Teléfono Domicilio"
$worksheet.Cells.Item(1, 5).Value = "Teléfono Móvil"
$worksheet.Cells.Item(1, 6).Value = "Notas"

# Escribir los datos de los usuarios en las filas siguientes
$row = 2
foreach ($user in $users) {
    $worksheet.Cells.Item($row, 1).Value = $user.GivenName
    $worksheet.Cells.Item($row, 2).Value = $user.Sn
    $worksheet.Cells.Item($row, 3).Value = $user.TelephoneNumber
    $worksheet.Cells.Item($row, 4).Value = $user.HomePhone
    $worksheet.Cells.Item($row, 5).Value = $user.Mobile
    $worksheet.Cells.Item($row, 6).Value = $user.info
    $row++
}

# Guardar el archivo Excel
$excelFilePath = "C:\teams\UsuariosAD.xlsx"
$workbook.SaveAs($excelFilePath)
$excel.Quit()
Write-Host "Exportación completada. Archivo guardado en $excelFilePath"


Al ejecutarlo sale este error (he borrado el nombre de la empresa por las xxxxxx)

al lanzar $users = Get-ADUser -Filter * -SearchBase $ou -Property GivenName,Sn,TelephoneNumber,HomePhone,Mobile,info da este error
 
Get-ADUser : El valor distinguishedName suministrado debe pertenecer a una de las particiones siguientes:
'DC=XXXXXXXX,DC=local , CN=Configuration,DC=XXXXXXXXXX,DC=local ,
CN=Schema,CN=Configuration,DC=XXXXXXX,DC=local , DC=ForestDnsZones,DC=XXXXXXXX,DC=local ,
DC=DomainDnsZones,DC=XXXXXXXXX,DC=local'.
En línea: 1 Carácter: 10
+ $users = Get-ADUser -Filter * -SearchBase $ou -Property GivenName,Sn,TelephoneNu ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Comm
   ands.GetADUser


Que está mal, o o cual es el formato en el que se debe indicar la OU con la que se va a trabajar?

Gracias
5 respuestas