====== Estadísticas de discos locales en SQL Server ======
Este script de PowerShell es útil para recopilar datos sobre el espacio en disco de los dispositivos lógicos en un servidor y almacenarlos en una tabla de SQL Server para su posterior análisis. Puede ser programado fácilmente en el Task Scheduler para ejecutarlo periódicamente y mantener actualizada la información. Sin embargo, algunas limitaciones incluyen la necesidad de configurar correctamente las credenciales de SQL Server y la autenticación, así como asegurar que las conexiones TCP/IP estén habilitadas. Además, debido a la complejidad y variabilidad de los entornos de SQL Server, pueden surgir desafíos adicionales en la configuración y mantenimiento del script. No obstante, una vez establecido, los datos recopilados pueden ser utilizados en herramientas de visualización como PowerBI para crear tableros informativos y tomar decisiones informadas sobre la gestión del almacenamiento y la infraestructura.
===== Creación de Usuario y Tabla en SQL Server =====
**Script de Creación de la Tabla:**
USE TEST;
GO
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'hddstats')
BEGIN
CREATE TABLE hddstats (
id INT IDENTITY(1,1) PRIMARY KEY,
timestamp DATETIME,
hostname NVARCHAR(255),
deviceID NVARCHAR(50),
FreeSpace FLOAT,
Size FLOAT,
UsedSpace FLOAT
);
END;
===== Script de PowerShell (para Insertar Datos): =====
# Definir las credenciales y la cadena de conexión a la base de datos
$serverName = "sql.ad.facundoitest.space"
$databaseName = "TEST"
$username = "svcSQL"
$password = "tu_contraseña"
# Obtener el hostname del servidor
$hostname = $env:COMPUTERNAME
# Crear la cadena de conexión
$connectionString = "Server=$serverName;Database=$databaseName;User ID=$username;Password=$password;"
# Obtener los datos utilizando el script existente
$data = Get-WmiObject -Class Win32_LogicalDisk | Select-Object DeviceID, VolumeName, @{Name="FreeSpace_GB";Expression={[math]::Round($_.FreeSpace / 1GB, 2) } }, @{Name="Size_GB";Expression={[math]::Round($_.Size / 1GB, 2)}}, @{Name="UsedSpace_GB";Expression={[math]::Round(($_.Size - $_.FreeSpace) / 1GB, 2)}}
# Conectar a la base de datos
$connection = New-Object System.Data.SqlClient.SqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
# Crear el comando SQL para insertar los datos en la tabla
foreach ($row in $data) {
$commandText = "INSERT INTO hddstats (timestamp, hostname, deviceID, FreeSpace, Size, UsedSpace) VALUES (GETDATE(), '$hostname', '$($row.DeviceID)', $($row.FreeSpace_GB), $($row.Size_GB), $($row.UsedSpace_GB))"
$command = New-Object System.Data.SqlClient.SqlCommand
$command.Connection = $connection
$command.CommandText = $commandText
$command.ExecuteNonQuery()
}
# Cerrar la conexión
$connection.Close()
**Consideraciones:**
- El usuario utilizado en la conexión es **de SQL** (no Windows).
- Antes de ejecutar el script, asegúrate de habilitar las conexiones TCP/IP desde el Configuration Manager de SQL Server.
- Además, es necesario habilitar el login de usuarios de Windows **y** SQL desde 'Propiedades > Seguridad' de la base de datos en SQL Server Management Studio.