Mostrando las entradas con la etiqueta vbscript. Mostrar todas las entradas
Mostrando las entradas con la etiqueta vbscript. Mostrar todas las entradas

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

script para agregar un pc a un dominio

Lo hice en vbscript porque los clientes no tienen powershell.

'**************************************************
' Agregar PC al Dominio.
' Autor: Jorge Mestre
' Fecha: 26/06/08
' Descripción: Agrega un PC al dominio.
'
'**************************************************

'objeto para obtener el nombre de usuario actual
set net = WScript.CreateObject("WSCript.Network")
'objeto para los inputbox
Set WSHShell = WScript.CreateObject("WScript.Shell")

'Definiciones por defecto
pcDef = "testprep"
domDef = "lab.dominio.local"
OUDef = "OU=PCs"
userDef = Net.UserName
userLocalDef = "Administrator"

'inputbox PC
pc = InputBox("introduzca el HOSTNAME del PC", _
"Introducir hostname del PC",pcDef)

'saliendo por no poner ningún hostname
If pc = "..." or pc = "" Then
WScript.Echo "no se indicó ningún hostname, saliendo..."
WScript.Quit()
End If

'check pc
wscript.echo "PC: " & pc

'revisando que se llega al PC
If Ping(pc) = False then
wscript.Echo pc & " no responde a PING..."
Wscript.Quit()
end If

'inputbox Dominio
dominio = InputBox("introduzca el DOMINIO (formato DNS) " & _
"al que debe pertenecer " & pc, _
"Introducir dominio para " & pc,domDef)

'saliendo por no poner dominio
If dominio = "..." or dominio = "" Then
WScript.Echo "no se indicó ningún dominio, saliendo..."
WScript.Quit()
End If

'comprobar que se introdujeron "." con el nombre de dominio
If Instr(dominio, ".") = 0 Then
wscript.echo "el dominio debe estar indicado como " & _
"subdominio.dominio - Ejemplo: es.prueba.com"
wscript.Quit()
End If

'check dominio
wscript.echo "Dominio: " & dominio


' Introducir OU
ou = InputBox("introduzca la OU: Ej: OU=Workstations," & _
"OU=Standard","Introducir OU",OUDef)

'pedir usuario dominio / por defecto, poner el nombre
'de usuario actual en el inputbox
user = InputBox("introduzca un usuario con permisos para " & _
"agregar " & pc & " al dominio " & dominio, _
"Introducir usuario de DOMINIO",userDef)

'pedir password
msg=MsgBox("introducir el password en la consola luego de " &_
"este mensaje",0,"password en consola")
Set objPassword = CreateObject("ScriptPW.Password")
WScript.StdOut.Write "Contraseña para " & user & " (DOMINIO):"
pass = objPassword.GetPassword()

'pedir admin local pc
userLocal = InputBox("introduzca un usuario con permisos " & _
"LOCALES en " & pc & " (por ejemplo el " & _
"administrador local ","Introducir usuario LOCAL" _
,userLocalDef)

'pedir password usuario local
msg=MsgBox("introducir el password para el usuario LOCAL " & _
"de " & pc & " en la consola luego de este " & _
"mensaje",0,"password en consola de usuario LOCAL")

Set objPassword = CreateObject("ScriptPW.Password")
WScript.StdOut.Write VbCrLf & "Contraseña para " & _
userLocal & " (LOCAL):"
passLocal = objPassword.GetPassword()

' confirmar datos
confirmar=MsgBox("¿Son los siguientes datos correctos?" & _
VbCrLf & VbCrLf & "PC: " & pc & VbCrLf & _
"Dominio: " & dominio & " (" & ou & ")" & VbCrLf & _
"Usuario Dominio: " & user & VbCrLf & _
"Usuario Local: " & userLocal & VbCrLf _
,1,"Confirmar datos")

if confirmar = 2 then
msg=MsgBox("proceso cancelado",0,"Cancelado")
wscript.quit()
end if

reiniciar = MsgBox("¿Desea reiniciar " & pc & _
" luego de agregarlo a dominio?" & VbCrLf & _
VbCrLf & "(Es Necesario, " & _
"pero quizas es conveniente mas tarde)",4, _
"¿Reiniciar?")

Set objShell = CreateObject("WScript.Shell")
if reiniciar = 1 then
strCmdNetDom = "%comspec% /c netdom join " & pc & _
" /Domain:" & dominio & _
" /userD:" & user & _
" /passwordD:" & pass & _
" /OU:" & ou & _
" /userO:" & userLocal & _
" /PasswordO:" & passLocal & _
" /reboot"
else
strCmdNetDom = "%comspec% /c netdom join " & pc & _
" /Domain:" & dominio & _
" /userD:" & user & _
" /passwordD:" & pass & _
" /OU:" & ou & _
" /userO:" & userLocal & _
" /PasswordO:" & passLocal
End if

Set objExecObj = objShell.Exec(strCmdNetDom)
strResNetDom = objExecObj.StdOut.ReadAll()

resultado = MsgBox ("Resultado" & vbcrlf & strResNetDom)

' Función para hacer Ping
Function Ping(pc)
Set objShell = CreateObject("WScript.Shell")
strCmdPing = "%comspec% /c ping -n 1 " & pc & ""
Set objExecObj = objShell.Exec(strCmdPing)
strResPing = objExecObj.StdOut.ReadAll()

If Instr(strResPing, "Respuesta") > 0 Then
Ping = True
Else
Ping = False
End If
End Function

Pasar un formato personalizado de fecha a powershell

$fechaPer = "20081005"
$fechaFormateado = [datetime]::ParseExact($fechaRaw,'yyyyMMdd',$null)
$fecha = get-date $fechaFormateado -format dd/MM/yyyy

fecha contiene un valor tipo "Date" válido, obtenido del string $fechaPer y formateado con el método ParseExact.

recorrer un archivo de texto sin cargarlo en memoria

Para recorrer un archivo de texto, podemos hacerlo de la siguiente manera
$archivo = get-content archivo.txt
y luego para recorrerlo
foreach ($linea in $archivo){
"muestro la linea: $linea"
}


el problema, es que get-content carga el archivo entero en memoria, y si bien, el archivo ocupa pocos megas, no es problema, pero en el caso de un archivo que mide gigas (como un log), nos va a cargar el archivo entero en memoria, por lo tanto, podemos ocupar .NET para recorrerlo sin que lo cargue, de la siguiente manera:

$archivo = [System.IO.File]::OpenText("archivo.txt")

while ($archivo.peek() -ne -1){
$linea = $archivo.ReadLine()
"muestro la linea: $linea"
}
$archivo.Close()

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

Cuando extrañamos cut

Bueno, además de traer muchisimos alias para comando linux, creo que hay que ir de a poco acostumbrandose a estos comandos que tienen la forma verbo-sustantivo, por lo tanto, tanto extraño cut para manejar archivos de texto, que me puse a ver como lo podia hacer.

**********************
Windows PowerShell Transcript Start
Start time: 20061026192848
Username : (######)
Machine :
(######) (Microsoft Windows NT 5.1.2600 Service Pack 2)
**********************
Transcript started, output file is C:\Documents and Settings\
(######)\Mis documentos\PowerShell_transcript.20061026192848.txt

hacemos un dir, o un ls

PS C:\extrayendo> Get-ChildItem
Directory: Microsoft.PowerShell.Core\FileSystem::C:\extrayendo
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 26/10/2006 18:52 154 lista.csv
-a--- 26/10/2006 19:29 122 lista.txt

Mostramos lo que tiene el .txt

PS C:\extrayendo> Get-Content lista.txt
Jorge.Mestre.24.soltero
Juan.Perez.30.casado
Pepe.Hongo.50.divorciado
Maria.DelMar.18.soltera
Laura.Noesta.27.casado

Ahora, por cada linea (foreach-Object) vamos a indicarle con el metodo split(), que queremos dividir cada linea por un punto, y que nos muestre de la linea, el 1 campo [0], luego, con sort, lo ordenamos

PS C:\extrayendo> Get-Content lista.txt | ForEach-Object{$_.split(".")[0]} | sort
Jorge
Juan
Laura
Maria
Pepe

Aqui, realizamos un "grep", una busqueda de una cadena de texto

PS C:\extrayendo> Get-Content lista.txt | Select-String "Perez"
Juan.Perez.30.casado

Primeros pasos (mios) con .csv en Powershell

bueno, hace muy poco que comencé a estudiar powershell, y me gustó bastante. Es muy robusto, y una vez que se entiende que lo que se ve no es texto, sino objetos, se puede comenzar a utilizar.
Ahora voy a mostar un archivo .csv, y formatearlo para su visualización.

Comienzo a grabar los comandos que tipee con Start-Transcript
Reemplazo datos confidenciales con (####)


C:\>Start-Transcript

**********************
Windows PowerShell Transcript Start
Start time: 20061026185314
Username : (####)
Machine : (####) (Microsoft Windows NT 5.1.2600 Service Pack 2)
**********************


Transcript started, output file is C:\Documents and Settings\(####)\Mis documentos\PowerShell_transcript.20061026185314.txt

PS C:\> Set-Location C:\extrayendo (alias cd)
PS C:\extrayendo> Get-ChildItem (alias dir, ls)

Directory: Microsoft.PowerShell.Core\FileSystem::C:\extrayendo

Mode LastWrite Time Length Name
---- ---------- ---- ----- ----
-a-- 26/10/2006 18:52 154 lista.csv

Format-table para ajustar el tamaño, recuerden que el pipe (|) esta pasando un OBJETO)

PS C:\extrayendo> Import-Csv lista.csv | Format-Table -autosize

nombre apellido edad estadoCivil
------ -------- ---- -----------
Jorge Mestre 24 soltero
Juan Perez 30 casado
Pepe Hongo 50 divorciado
Maria DelMar 18 soltera
Laura Noesta 27 casado

Selecciono propiedades del objeto a mostrar, el format siempre al final

PS C:\extrayendo> Import-Csv lista.csv | select nombre,apellido | Format-Table -autosize

nombre apellido
------ --------
Jorge Mestre
Juan Perez
Pepe Hongo
Maria DelMar
Laura Noesta

Muestro condicionando segun el contenido de una propiedad. Esto es "Donde el objeto (que viene del pipe y lo nombramos $_
le indicamos que queremos solo los apellidos que sean iguales (-eq) a la cadena de texto "Mestre", luego, formateamos para que se vea correctamente.

PS C:\extrayendo> Import-Csv lista.csv | Where-Object{$_.apellido -eq "Mestre"} | Format-Table -autosize

nombre apellido edad estadoCivil
------ -------- ---- -----------
Jorge Mestre 24 soltero


PS C:\extrayendo> Import-Csv lista.csv | Where-Object{$_.apellido -eq "Mestre"} | select nombre,edad | Format-Table -autosize

nombre edad
------ ----
Jorge 24


PS C:\extrayendo> Stop-Transcript
**********************
Windows PowerShell Transcript End
End time: 20061026190300
**********************


Si nunca has trabajado con objetos, se les va a complicar visualizarlo MUCHISIMO al principio (como a mi), luego, con pratica y reventones de neuronas, va saliendo de a poco