Archivo

Entradas Etiquetadas ‘scripting’

SCRIPT – saber todos los usuarios que pertenecen a un directorio

martes, 18 de diciembre de 2012 Comments off

Hola a todos,

Esta vez os voy a dejar un Script que he tenido que montar para saber los usuarios que tienen acceso a unos directorios compartidos. Esta petición sería muy complicada, si no fuera, por que uno de los directorios en cuestión es un maldito saco roto con 15 grupos de directorio activo, con herencias cortadas, etc.

El Script que se lanza, genera 1 fichero que indicamos nosotros, en este caso, logACL o el nombre del directorio a extraer la información, y tantos ficheros Grupo_AD/user como permisos tienen.

Para lanzar el Script, tenemos que pasar como parámetro, el directorio a realizar el escaneo, y el fichero en donde indicará todas las ACL del directorio y subdirectorios.

cscript ListACLFolders.vbs DIR_ACL_FIND LogACL.csv

Nos generará un CSV, o fichero plano de texto con los siguientes campos:

  • Día
  • Hora
  • Directorio
  • Grupo o usuario
  • Permisos comunes
  • Permisos especiales
  • Tipo de acceso
  • Herencia
  • Errores

Deberemos de modificar la variable strDirectory dentro del proceso ShowSubACL para indicarle en donde vamos a guardar los grupos de acceso de cada directorio.

El SCRIPT:

On Error Resume Next
Const ForAppending = 8
‘Commom Permissions
Const FOLDER_FULL_CONTROL = 2032127
Const FOLDER_MODIFY = 1245631
Const FOLDER_READ_ONLY = 1179785
Const FOLDER_READ_CONTENT_EXECUTE =  1179817
Const FOLDER_READ_CONTENT_EXECUTE_WRITE =  1180095
Const FOLDER_WRITE = 1179926
Const FOLDER_READ_WRITE = 1180063
‘Special Permissions
Const FOLDER_LIST_DIRECTORY = 1
Const FOLDER_ADD_FILE = 2
Const FOLDER_ADD_SUBDIRECTORY = 4
Const FOLDER_READ_EA = 8
Const FOLDER_WRITE_EA = 16
Const FOLDER_EXECUTE = 32
Const FOLDER_DELETE_CHILD = 64
Const FOLDER_READ_ATTRIBUTES = 128
Const FOLDER_WRITE_ATTRIBUTES = 256
Const FOLDER_DELETE = 65536
Const FOLDER_READ_CONTROL = 131072
Const FOLDER_WRITE_DAC = 262144
Const FOLDER_WRITE_OWNER = 524288
Const FOLDER_SYNCHRONIZE = 1048576
Const FOLDER_INHERITED_ACE = 16
Const SE_DACL_PRESENT = 4
Const ACCESS_ALLOWED_ACE_TYPE = 0
Const ACCESS_DENIED_ACE_TYPE  = 1

strComputer = «.»
strTargetPath = WScript.Arguments.Item(0)
strOutFile = WScript.Arguments.Item(1)
strdrop = «»

Set objFSO = CreateObject(«Scripting.FileSystemObject»)
Set objOutFile = objFSO.OpenTextFile(strOutFile, ForAppending, True)

objOutFile.Writeline «Date;Time;Folder;Group / User Name;Commom Permission’s;Special Permission’s;Access Type;Inheritance;Error’s»

ShowSubACL objFSO.GetFolder(strTargetPath)
ShowSubfolders objFSO.GetFolder(strTargetPath)

objOutFile.Close

Sub ShowSubFolders(Folder)
 On Error Resume Next
    For Each Subfolder in Folder.SubFolders
  ShowSubACL(Subfolder.Path)
  
  ShowSubFolders Subfolder
  If Err.Number = 0 Then
   strErros = «No Error’s»
  ElseIf Err.Number = 451 Then
   strErros = «No Error’s»
   Err.clear
  Else
   strErros = «Cod.: » & Err.Number & » Desc.: » & Err.description
   objOutFile.Writeline Date() & «;» & Time() & «;» & FolderPerm & «;» & «» & «» & «» & «;» & «» & «;» & «» & «;» & «»  & «;» & «» & «;» & strErros
   Err.clear
  End If
    Next
End Sub

Sub ShowSubACL(FolderPerm)
 On Error Resume Next
 strCPerm = «»
 strSPerm = «»
 strTypePerm = «»
 strInherit = «»
 strErros = «»
 Dim WshShell, strDirectory, strFile
 Set WshShell = WScript.CreateObject(«Wscript.Shell»)
 Set objWMIService = GetObject(«winmgmts:»)
 Set objFolderSecuritySettings = objWMIService.Get(«Win32_LogicalFileSecuritySetting='» & FolderPerm & «‘»)
 intRetVal = objFolderSecuritySettings.GetSecurityDescriptor(objSD)
 intControlFlags = objSD.ControlFlags
 strDirectory = «DIRECTORIO_EN_DONDE_GUARDAR_LOS_GRUPOS_CON_USUARIOS»
 Set objFSO = CreateObject(«Scripting.FileSystemObject»)
 If intControlFlags AND SE_DACL_PRESENT Then
  arrACEs = objSD.DACL
  If Err.Number = 0 Then
   strErros = «No Error’s»
  Else
   strErros = «Cod.: » & Err.Number & » Desc.: » & Err.description
   objOutFile.Writeline Date() & «;» & Time() & «;»»» & FolderPerm  & «»»;» & «» & «» & «» & «;» & «» & «;» & «» & «;» & «»  & «;» & «» & «;» & strErros
   Err.clear
  End If
  For Each objACE in arrACEs
   
 
   ‘ACL Type
   If objACE.AceType = ACCESS_ALLOWED_ACE_TYPE Then strTypePerm = «Allowed»
   If objACE.AceType = ACCESS_DENIED_ACE_TYPE Then strTypePerm = «Denied»
   
   ‘Inherit
   If objAce.AceFlags AND FOLDER_INHERITED_ACE Then
    strInherit = «Yes»
   Else
    strInherit = «No»
   End if
   
   ‘Commom Permissions
   If objACE.AccessMask = FOLDER_FULL_CONTROL Then
    strCPerm = «Full Control»
   ElseIf objACE.AccessMask = FOLDER_MODIFY Then
    strCPerm = «Modify»
   ElseIf objACE.AccessMask = FOLDER_READ_CONTENT_EXECUTE_WRITE Then
    strCPerm = «Read & Execute / List Folder Contents (folders only) + Write»
   ElseIf objACE.AccessMask = FOLDER_READ_CONTENT_EXECUTE Then
    strCPerm = «Read & Execute / List Folder Contents (folders only)»
   ElseIf objACE.AccessMask = FOLDER_READ_WRITE Then
    strCPerm = «Read + Write»
   ElseIf objACE.AccessMask = FOLDER_READ_ONLY Then
    strCPerm = «Read Only»
   ElseIf objACE.AccessMask = FOLDER_WRITE Then
    strCPerm = «Write»
   Else
    strCPerm = «Special»
   End If
   
   ‘Special Permissions
   strSPerm = «»
   If objACE.AccessMask and FOLDER_EXECUTE Then strSPerm = strSPerm & «Traverse Folder/Execute File, »
   If objACE.AccessMask and FOLDER_LIST_DIRECTORY Then strSPerm = strSPerm & «List Folder/Read Data, »
   If objACE.AccessMask and FOLDER_READ_ATTRIBUTES Then strSPerm = strSPerm & «Read Attributes, »
   If objACE.AccessMask and FOLDER_READ_EA Then strSPerm = strSPerm & «Read Extended Attributes, »
   If objACE.AccessMask and FOLDER_ADD_FILE Then strSPerm = strSPerm & «Create Files/Write Data, »
   If objACE.AccessMask and FOLDER_ADD_SUBDIRECTORY Then strSPerm = strSPerm & «Create Folders/Append Data»
   If objACE.AccessMask and FOLDER_WRITE_ATTRIBUTES Then strSPerm = strSPerm & «Write Attributes, »
   If objACE.AccessMask and FOLDER_WRITE_EA Then strSPerm = strSPerm & «Write Extended Attributes, »
   If objACE.AccessMask and FOLDER_DELETE_CHILD Then strSPerm = strSPerm & «Delete Subfolders and Files, »
   If objACE.AccessMask and FOLDER_DELETE Then strSPerm = strSPerm & «Delete, »
   If objACE.AccessMask and FOLDER_READ_CONTROL Then strSPerm = strSPerm & «Read Permissions, »
   If objACE.AccessMask and FOLDER_WRITE_DAC Then strSPerm = strSPerm & «Change Permissions, »
   If objACE.AccessMask and FOLDER_WRITE_OWNER Then strSPerm = strSPerm & «Take Ownership, »
   If objACE.AccessMask and FOLDER_SYNCHRONIZE Then strSPerm = strSPerm & «Synchronize, »
   If trim(strSPerm) <> «» then strSPerm =  left(strSPerm, len(strSPerm)-2)

   If UCase(strdrop) = UCase(«/dropInherit») and objAce.AceFlags AND FOLDER_INHERITED_ACE Then
 
   Else 
    objOutFile.Writeline Date() & «;» & Time() & «;»»» & FolderPerm & «»»;»»» & objACE.Trustee.Domain & «» & objACE.Trustee.Name & «»»;» & strCPerm & «;» & strSPerm & «;» & strTypePerm  & «;» & strInherit & «;» & strErros
 
   
    strFile = strDirectory & «» & objACE.Trustee.Name &».TXT»
    If objFSO.FileExists(strFile) Then
    Else
       desquerygroup = «dsquery group -samid » & chr(34) & objACE.Trustee.Name & chr(34) & » | dsget group -members -expand | dsget user -samid -display> » & strFile
       wshShell.Run  «cmd.exe /C » & desquerygroup
       
    End if
   End if 
  Next
 End If
End Sub

un Saludo!

SCRIPT para monitorear espacio en las unidades de disco local

miércoles, 23 de noviembre de 2011 Comments off

Aunque es un tema que se ha tratado muchas veces y existe mucha información en internet, voy a aportar mi granito de arena al tema de monitorización «descentralizada» (por el tema de que cada vez más existen plataformas de monitorización que se encargan de estas tareas).

El Script en cuestión se separa en 2 partes, la primera, que es la parte de monitorizar el espacio en disco, mediante la ejecución cada X minutos/horas desde una tarea programada y la segunda parte, es el envío de un correo con la información de que partición es la que se está quedando sin espacio.

‘ SCRIPT CREADO POR MANUEL ROLDÁN – www.eManu.esmroldan@emanu.es
‘ Como utilizar El Script
‘ Editar las variables USUARIO, PASSWORD, SMTP y PUERTO. Para configurar vuestro servidor SMTP
‘ Al final de Script, tenéis que indicar los campos CC, CCO, BCC y FROM (CUIDADO CON LAS COMILLAS)
‘ Configurar una tarea programada con permisos adecuados para hacer funcionar el Script
strComputer = «.»
Set objWMIService = GetObject(«winmgmts:\» & strComputer & «rootcimv2»)
Set colItems = objWMIService.ExecQuery(«Select * from Win32_Volume»)
Set wshShell = WScript.CreateObject( «WScript.Shell» )
strComputerName = wshShell.ExpandEnvironmentStrings( «%COMPUTERNAME%» )
text = «»
For Each objItem In colItems
FSpace=objItem.FreeSpace
FSpace = (FSpace / 1024^3)
 if FSpace < 10 Then
msg = «1»
 texto = «La unidad: » & objItem.DriveLetter & » Con Nombre: » & ucase (objItem.Label) & » Tiene un espacio libre de: » & FormatNumber(FSpace,2) & » Gb «
text = text & vbNewLine & texto
end if
Next
msg = strComputerName & vbNewLine & text
if msg <> «» then
sendMAIL(msg)
end if
Sub sendMAIL(msg)
Set objEmail = CreateObject(«CDO.Message»)
Dim strbody
Dim Flds
Dim USUARIO = «MyUSER»
 Dim PASSWORD = «MyPASS»
 Dim SMTP = «smtp.gmail.com» ‘ Puede ser cualquier otro servidor.
 Dim PUERTO = «465» ‘ También puede ser el 25 cuando no hay autentificación      
Set iMsg = CreateObject(«CDO.Message»)
Set iConf = CreateObject(«CDO.Configuration»)
iConf.Load -1    ‘ CDO Source Defaults
Set Flds = iConf.Fields
With Flds
.Item(«http://schemas.microsoft.com/cdo/configuration/smtpauthenticate«) = 1
.Item(«http://schemas.microsoft.com/cdo/configuration/smtpusessl«) = true
.Item(«http://schemas.microsoft.com/cdo/configuration/sendusername«) = USUARIO
.Item(«http://schemas.microsoft.com/cdo/configuration/sendpassword«) = PASSWORD
.Item(«http://schemas.microsoft.com/cdo/configuration/sendusing«) = 2
.Item(«http://schemas.microsoft.com/cdo/configuration/smtpserver«) = SMTP
.Item(«http://schemas.microsoft.com/cdo/configuration/smtpserverport«) = PUERTO
.Update
End With
strbody = msg
With iMsg
Set .Configuration = iConf
.To = «»
        .CC = «»
        .BCC = «»
        .From = «»»NOMBRE REMITENTE»» <CORREO_DEL_REMITENTE@Mi_DOMINIO.com
        .Subject = «El Servidor esta sin espacio»
.TextBody = strbody
.Send
End With
End Sub

En donde deberemos modificar los siguientes atributos/parámetros, para customizarlo como mejor nos convenga:

  1. Aviso de espacio –> Es el espacio espresado en Gb, por el cual vamos a lanzar la alerta, en este caso, la alerta está cuando el espacio en cualquier partición es inferior a 10Gb.
    if FSpace < 10 Then
  2. text0 –> Es el mensaje que vamos a mostrar en el cuerpo del correo electrónico, se puede variar con otra información/mensaje.
    texto = «La unidad: » & objItem.DriveLetter & » Con Nombre: » & ucase (objItem.Label) & » Tiene un espacio libre de: » & FormatNumber(FSpace,2) & » Gb «
  3. Variables –> Es la información que necesitamos para poder realizar la autentificación mediante SMTP al servidor de correo, y así poder enviar el correo.
    Dim USUARIO = «MyUSER»
    Dim PASSWORD = «MyPASS»
    Dim SMTP = «smtp.gmail.com» ‘ Puede ser cualquier otro servidor.
    Dim PUERTO = «465» ‘ También puede ser el 25 cuando no hay autentificación
  4. Envío de correo –> tendremos que indicar a quien va dirigido el mail, y desde que cuenta (CUIDADO CON LAS COMILLAS).
    .To = «»
    .CC = «»
    .BCC = «»
    .From = «»»NOMBRE REMITENTE»» <CORREO_DEL_REMITENTE@Mi_DOMINIO.com
    .Subject = «El Servidor esta sin espacio»

Por último, y una vez probado que funciona el envío correctamente, generaremos una tarea programada para que se ejecute cada cierto tiempo, según el crecimiento de espacio que tenga el servidor.

Hay que tener en cuenta, que si la terea se lanza cada hora, y el servidor se queda por debajo del humbral que hemos configurado, cada hora se lanzará y recibiremos un correo, hasta que se libere espacio del disco/partición o se deshabilite la tarea programada.

Categories: Microsoft Tags: , , , ,