Mostrando las entradas con la etiqueta active directory. Mostrar todas las entradas
Mostrando las entradas con la etiqueta active directory. Mostrar todas las entradas

Listar los Domain controllers de un dominio

$dcObj = [adsi]"LDAP://OU=domain controllers,dc=ar,dc=lugsaju,dc=com"
$dcs = $dcObj.PSBase.Children | % { $_.name }
$cantDCs = $dcs.count
$contDC = 0
foreach ($dc in $dcs){
$a = ping -n 1 $dc
$a = $(($a[2]).split("[")[1]).split("]")[0]
write-output "$dc`t$a"
}

con la ip de bonus track

función para nombrar archivos de log - vbscript

Function NomArch(NomArch)    ' Para nombrar los archivos.
Dim arch,hoy,aa,mm,dd
hoy = Date
aa = year(hoy)
mm = month(hoy)
dd = day(hoy)
arch = aa & "_0" & mm & "_" & dd & "_" & NomArch & ".log" ' Formato: \AAAA_MM_DD_NomArch.log
NomArch = arch
End Function

' uso
Set objFS = CreateObject("Scripting.FileSystemObject")
carpeta = "C:\logs"
ArchLogGen = "LogGeneral"
NomLog = NomArch(strArchLogGen)
Set logArchLogGen = objFS.OpenTextFile(carpeta & NomLog, 8,TRUE)

objFS.Close

Ultimo logon de usuario

Creditos a Richard Mueller por el script, posteado originalmente aqui.
He modificado la propiedad LastLogon por LastLogonTimeStamp, valor que SI se replica entre DCs.



Option Explicit

Dim objRootDSE, adoConnection, adoCommand, strQuery
Dim adoRecordset, strDNSDomain, objShell, lngBiasKey
Dim lngBias, k, strDN, dtmDate, objDate, nom
Dim strBase, strFilter, strAttributes, lngHigh, lngLow

' Obtain local Time Zone bias from machine registry.
Set objShell = CreateObject("Wscript.Shell")
lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
& "TimeZoneInformation\ActiveTimeBias")
If (UCase(TypeName(lngBiasKey)) = "LONG") Then
lngBias = lngBiasKey
ElseIf (UCase(TypeName(lngBiasKey)) = "VARIANT()") Then
lngBias = 0
For k = 0 To UBound(lngBiasKey)
lngBias = lngBias + (lngBiasKey(k) * 256^k)
Next
End If
Set objShell = Nothing

' Determine DNS domain from RootDSE object.
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")
Set objRootDSE = Nothing

' Use ADO to search Active Directory.
Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection

' Search entire domain.
strBase = ""

' Filter on all user objects.
strFilter = "(&(objectCategory=person)(objectClass=user))"

' Comma delimited list of attribute values to retrieve.
strAttributes = "distinguishedName,sAMAccountName,lastLogonTimeStamp"

' Construct the LDAP syntax query.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"

' Run the query.
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 1000000
adoCommand.Properties("Timeout") = 6000
adoCommand.Properties("Cache Results") = False
Set adoRecordset = adoCommand.Execute

' Enumerate resulting recordset.
Do Until adoRecordset.EOF
' Retrieve attribute values for the user.
strDN = adoRecordset.Fields("sAMAccountName").Value
nom = adoRecordset.Fields("sAMAccountName").Value
' Convert Integer8 value to date/time in current time zone.
On Error Resume Next
Set objDate = adoRecordset.Fields("lastLogonTimeStamp").Value
If (Err.Number <> 0) Then
On Error GoTo 0
dtmDate = #1/1/1601#
Else
On Error GoTo 0
lngHigh = objDate.HighPart
lngLow = objDate.LowPart
If (lngLow < 0) Then
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0 ) Then
dtmDate = #1/1/1601#
Else
dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
+ lngLow)/600000000 - lngBias)/1440
End If
End If
' Display values for the user.
If (dtmDate = #1/1/1601#) Then
Wscript.Echo nom & ";Never"
Else
Wscript.Echo nom & ";" & dtmDate
End If
adoRecordset.MoveNext
Loop

' Clean up.
adoRecordset.Close
adoConnection.Close
Set adoConnection = Nothing
Set adoCommand = Nothing
Set adoRecordset = Nothing
Set objDate = Nothing

función para escribir logs

Lo acabo de hacer, y me pareció útil guardarlo por aqui:

# archivo con fecha ej: log_20030318.log
$ArchLog = "log_"+"$(get-date -format yyyyMMdd)"+".log"

function escLog($texto){
write-output "$(get-date -format hh:mm:ss): $texto" |
out-file -encoding ascii -append $ArchLog
}

#pruebas
escLog "Incio LOG"
sleep 2
escLog "Otra Linea"
sleep 5
escLog "2+2 son $(2+2)"

la salida es:
11:34:14: Incio LOG
11:34:16: Otra Linea
11:34:21: 2+2 son 4

mostrar traps snmp

param($lista)
$arch = ".\salida.csv"
"hostname`tcomunidad`ttrap`tvalor" > $arch

function check-ping ([string]$pc) {
$HostVivo = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$pc'"
if (($HostVivo.StatusCode -ne "0") -or ($pc -eq $null)){
return $false
}
else{
return $true
}
}

function nulo ($txthost,$txtout){
write-host "$txthost" -fore cyan
write-output "txtout" out-file -append $arch
}

$listaS = gc $lista

foreach ($s in $listaS){
if (-not $(check-ping $s)){nulo "$s`tno responde (por wmi)" "$s`tno responde (por wmi)";continue}
$baseKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $s)
$key = $baseKey.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\SNMP\\Parameters\\TrapConfiguration", $false)
if ($key -eq $null){nulo "$s`t$dirBase no existe" "$s`t$dirBase no existe";continue}
$comunidades = $key.GetSubKeyNames()
if ($comunidades -eq $null){nulo "$s`tNo hay comunidades definidas" "$s`tno hay comunidades definidas";continue}
foreach ($comunidad in $comunidades){
$com = $Key.OpenSubKey("$comunidad", $false)
$traps = $com.getValueNames()
if ($traps -eq $null){nulo "$s`tNo hay traps configurados definidos en la comunidad $com" "$s`tNo hay traps definidos en la comunidad $com";continue}
foreach ($trap in $traps){
$val = $com.GetValue($trap)
}
write-output "$s`t$comunidad`t$trap`t$val" out-file -append $arch

write-host "`t$s" -fore cyan
write-host "`t`tcomunidad: $comunidad" -fore green
write-host "`t`t trap: $trap" -fore green
write-host "`t`t valor: $val`n" -fore green
}
}
$com.Close()
$key.Close()
$baseKey.Close()

crear snapshots de VMs en VMware server

# crea snapshots de VMs en vmware-server.
# Jorge Mestre

clear
write-host "- Este script asume que está instalado VMware Server 1.0.4" -fore yellow
write-host "y que está instalado en `"c:\Program Files\VMware\`"" -fore yellow
write-host "" -fore yellow
write-host "- También asume que este script se está instalando desde el host" -fore yellow
write-host "donde se encuentra instalado VMware server." -fore yellow
write-host "" -fore yellow
write-host "ATENCION!!!" -fore yellow
write-host "-----------" -fore yellow
write-host "" -fore yellow
write-host "este script detendra el Guest que se especifique," -fore yellow
write-host "y creará una copia en la subcarpeta donde reside," -fore yellow
write-host "con el formato AAAAMMDD_HHMMSS" -fore yellow
write-host ""
write-host "¿Desea continuar (S/N)? " -fore cyan -nonewline
$cont = read-host
if ($cont -ne "s"){exit}

$vmrun_List = & 'C:\Program Files\VMware\VMware VIX\vmrun.exe' list

if ($vmrun_List -eq 'Total running VMs: 0'){
"Ningun guest en ejecución...";exit
}

write-host "`nGuests en ejecución: " -fore darkgreen
write-host "------ -- ----------`n" -fore blue
for ($i=0;$i -lt $vmrun_List.length;$i++){
if ($i -eq 0){continue}
write-host "`t$i - $($vmrun_List[$i])`n" -fore cyan
}

write-host "`nElija el número de guest para crear el snapshot: " -fore green -nonewline
$opc = read-host
if ($opc -ge $vmrun_List.length){
"Opción erronea";exit
}

$vm = $vmrun_list[$opc]

write-host "¿apagar $vm y crear snapshot? (S/N):" -fore cyan -nonewline

$cont = read-host
if ($cont -ne "s"){exit}

write-host "apagando guest...." -fore darkGreen
$vmrun_stop = & 'C:\Program Files\VMware\VMware VIX\vmrun.exe' stop $vm
write-host "guest apagado." -fore darkGreen

$padre = (ls $vm).Directory.FullName
$padre = "$padre"

$nomDir = "{0:yyyyMMdd_HHmmss}" -f (get-date)
$nDir = "$padre"+"\"+"$nomdir"

mkdir $nDir

cp "$padre\*.vmdk" $nDir -passthru
cp "$padre\*.vmem" $nDir -passthru
cp "$padre\*.vmx" $nDir -passthru
cp "$padre\*.nvram" $nDir -passthru

write-host "`n`tsnapshot creado en $nDir`n" -fore green

Listar impresoras en Active Directory

Para publicar, o republicar todas las impresoras de un servidor en Active directory:
c:\> setprinter.exe \\servidor 7 "dwAction=republish"
asimismo, sirve para publicar (publish) y para despublicar (unpublish)
y tambien se puede especificar una impresora \\servidor\nombreImpresora

exit status codes de robocopy

0: no se hizo copia ni hubo errores. el origen y el destino están sincronizados.
1: copia exitosa.
2: se encontraron archivos en el destino que no estan en el origen
3: copia exitosa, ademas se encontraron archivos en el destino que no estan en el origen.
4 o mayor: error (hay codigos de error especificos, pero lo importante es saber que ha fallado)

Habilitar y deshabilitar un usuario en Active Directory

$cn = "CN=Jorge Mestre,OU=Users,DC=ar,DC=lugsaju,DC=com"
$usuario = new-object DirectoryServices.DirectoryEntry("LDAP://$cn")

$usuario.userAccountControl=66050 # deshabilitar
$usuario.setinfo()

$usuario.userAccountControl=66048 # habilitar
$usuario.setinfo()

"Mover" propiedades entre objetos en Active Directory

Teniendo dos DNs, creamos los objetos correspondientes:

$cnA = ""CN=grupoA,OU=Groups,DC=ar,DC=lugsaju,DC=com"
$cnB = ""CN=grupoB,OU=Groups,DC=ar,DC=lugsaju,DC=com"

$grupoA = new-object DirectoryServices.DirectoryEntry("LDAP://$cnA")
$grupoB = new-object DirectoryServices.DirectoryEntry("LDAP://$cnB")


una vez que tenemos los objetos ADSI ($grupoA,$grupoB), vamos a mover el campo "info" desde el $grupoA al $grupoB:

$grupoA.info
esto es un texto informativa
$grupoB.info
$


primero, guardamos el info en una var:
$infoTemp = $grupoA.info

luego, asignamos a $grupoB el contenido de la var:
$grupoB.psbase.InvokeSet("info","$info")
$grupoB.psbase.CommitChanges()


entonces, eliminamos el contenido del campo info del $grupoA
$grupoA.putEx(1,"info",0) # es un cero
$grupoA.setInfo()


y comprobamos:
$grupoA.info
$
$grupoB.info
esto es un texto informativa
$


Ahora lo vamos a complicar un poco mas, al mover el Manager del grupoA al grupoB

el campo ManagedBy contiene un objeto de AD (no es solo texto), por lo tanto, tenemos que obtener 1º este objeto y luego, realizar lo mismo que antes, por lo tanto

$MgrDN = $grupoA.managedBy
$Mgr= new-object DirectoryServices.DirectoryEntry("LDAP://$MgrDN")
$Manager = $Mgr.distinguishedName


asignamos el managedBy al grupoB

$grupoB.psbase.invokeSet("managedBy","$Manager")
$grupoB.psbase.CommitChanges()


Eliminamos el Manager del grupoA
$grupoA.PutEx(1,"managedBy",0)
$grupoA.setInfo()

Eliminar propiedades de objetos en Active Directory

vamos a crear el objeto que nos conecta con el grupo:

$cn = "CN=GRUPO_G,OU=Groups,DC=ar,DC=lugsaju,DC=com"
$grupo = new-object DirectoryServices.DirectoryEntry("LDAP://$cn")

vamos a eliminar el campo ManagedBy del grupo:
$grupo.ManagedBy
CN=Jorge Daniel Mestre,OU=People,DC=ar,DC=lugsaju,DC=com

$grupo.PutEx(1,"managedBy",0) # cero al final, el 1 es el que "limpia" la propiedad.
$grupo.setInfo() # ejecutamos realmente el cambio en AD.

$grupo.ManagedBy
$

Ahora eliminaremos el campo "Notas" (info)

$grupo.info
esto es una nota en el campo notas

$grupo.PutEx(1,"info",0)
$grupo.SetInfo()
$grupo.Info
$

Buscando grupos en Active Directory segun el type y scope

Para buscar un grupo en Active Directory con Powershell, primero, indicamos el servidor en el que vamos a buscar:
$raiz = "LDAP://ar.lugsaju.com.ar"
$buscador = new-object DirectoryServices.DirectorySearcher($raiz)

Una vez creado el objeto, definimos algunas propiedades:

$buscador.PageSize = 10000
$buscador.CacheResults = $false
$buscador.Filter = '(objectClass=group)'
$buscador.FindAll()

Ahora, si queremos buscar grupos por tipo, debemos referirnos a esta tabla:

scope

Tipo de grupo

Valor “GroupType”

Universal

Security

-2147483640

Global

Security

-2147483646

Domain Local

Security

-2147483644

Universal

Distribution

8

Global

Distribution

2

Domain Local

Distribution

4


Entonces, para buscar todos los grupos globales de seguridad,

$buscador.Filter = '(&(objectClass=group)(groupType=-2147483646))'

o para buscar los grupos Domain local de Distribución, que comiencen con la palabra "LUG"

$buscador.Filter = '(&(objectClass=group)(groupType=4)(name=LUG*))'

dividir strings en Powershell

dividir un string por un caracter:

$a = "powershell,jorge,windows"
$a.split(",")
powershell
jorge
windows

Seleccionar un elemento
$a.split(",")[1]
jorge

Dividir por un caracter, y limpiar los espacios en blanco:
$a = "powershell2 jorge2 windows"
$a.split("2")
powershell
jorge
windows

$a.split("2",[StringSplitOptions]::RemoveEmptyEntries)
powershell
jorge
windows