Página 1 de 1

[RESUELTO] WAPT.write_audit_data_if_changed

Publicado: 19 de septiembre de 2024 - 11:48 a. m.
por Vincent Moisan
Buen día,

Soy administrador de sistemas en una escuela.

Para conocer la frecuencia de uso de las PC implementadas, creé un paquete que informa las duraciones de las sesiones de usuario (en función de las conexiones/desconexiones/bloqueos/desbloqueos de sesiones de Windows).

Sin embargo, para facilitar la consulta, me gustaría almacenar esta información en la sección Datos de auditoría.

Para ello, utilicé la función WAPT.write_audit_data_if_changed, pasando los resultados de mi paquete en formato JSON como parámetro. Los datos se almacenan correctamente en los datos de auditoría, pero no se interpretan correctamente. Es decir, tengo algo parecido a JSON en la línea "value", pero con un formato incorrecto.
ejemplo:

Código: Seleccionar todo

users connexions stats.pc-test =

"{\"report_date\":\"2024-09-18T13:57:46Z\",\"hostname\":\"PC-Test\",\"session_data\":[{\"history_days\":-1,\"total_minutes\":\"52\",\"start_date\":\"2024-09-17T13:57:31Z\",\"total_days\":\"0\",\"total_hours\":\"4\",\"total_seconds\":\"54\",\"date_history\":\"-1\"},{\"history_days\":-7,\"total_minutes\":\"56\",\"start_date\":\"2024-09-11T13:57:35Z\",\"total_days\":\"0\",\"total_hours\":\"20\",\"total_seconds\":\"3\",\"date_history\":\"-7\"},{\"history_days\":-15,\"total_minutes\":\"57\",\"start_date\":\"2024-09-03T13:57:38Z\",\"total_days\":\"1\",\"total_hours\":\"21\",\"total_seconds\":\"36\",\"date_history\":\"-15\"},{\"history_days\":-30,\"total_minutes\":\"50\",\"start_date\":\"2024-08-19T13:57:42Z\",\"total_days\":\"3\",\"total_hours\":\"20\",\"total_seconds\":\"13\",\"date_history\":\"-30\"}]}\r\n"
Date: 2024-09-18T11:57:46.985788
¿Podrías orientarme sobre lo que estoy haciendo mal?

Atentamente

Re: WAPT.escribir_datos_de_auditoría_si_han_cambiado

Publicado: 19 de septiembre de 2024 - 12:40 p. m.
por sfonteneau
Hola,

si nos proporcionas el código de tu paquete, será más fácil ayudarte (además, el código podría ser útil).

Re: WAPT.escribir_datos_de_auditoría_si_han_cambiado

Publicado: 19 de septiembre de 2024 - 14:19
por Vincent Moisan
Aquí está el código de mi paquete:

Código: Seleccionar todo

### -*- coding: utf-8 -*-
from setuphelpers import *

def install():
    filecopyto('Compteur_Session.ps1',makepath(programfiles32,'wapt'))
def write_audit_data_if_changed(self, section, key, value):
    """Write data only if different from last one"""
def audit():
    output = run(r'powershell.exe -NoProfile -NonInteractive -executionpolicy bypass -File "%s"' % makepath(programfiles32,'wapt','Compteur_Session.ps1') ,accept_returncodes=[1,0])
    print(output)
    WAPT.write_audit_data_if_changed('Users Connexions Stats','%s' % get_computername(), output)
    return "OK"

También adjunté mi script de PowerShell en formato txt y luego lo comprimí.

Re: WAPT.escribir_datos_de_auditoría_si_han_cambiado

Publicado: 20 de septiembre de 2024 - 12:54 p. m.
por sfonteneau
La salida no es un diccionario sino un archivo JSON

Así que si haces una

Código: Seleccionar todo

WAPT.write_audit_data_if_changed('Users Connexions Stats','%s' % get_computername(),json.loads(output))

Debería ser mejor


Nota para hacer este tipo de cosas en Python:

Código: Seleccionar todo

# -*- coding: utf-8 -*-
from setuphelpers import *
import wmi
from datetime import datetime

# Usable WAPT package functions: install(), uninstall(), session_setup(), audit(), update_package()
# Declaring global variables - Warnings: 1) WAPT context is only available in package functions; 2) Global variables are not persistent between calls

def install():
    # auditpol /list /subcategory:*
    # auditpol /get /category:*

    #SET
    run('AUDITPOL /SET /SUBCATEGORY:"Ouvrir la session" /SUCCESS:ENABLE /FAILURE:ENABLE')
    run('AUDITPOL /SET /SUBCATEGORY:"Fermer la session" /SUCCESS:ENABLE /FAILURE:ENABLE')

def audit():
    # Initialize WMI objects and query.
    wmi_o = wmi.WMI('.')
    wql = ("SELECT * FROM Win32_NTLogEvent WHERE Logfile="
           "'System' AND EventCode='7001' OR EventCode='7002'")
    # Query WMI object.
    wql_r = wmi_o.query(wql)
    wql_r.reverse()
    for event in wql_r:
        sid = list(event.InsertionStrings)[1]
        if not sid.startswith('S-1-5'):
            continue
        username = get_user_from_sid(sid)
        if username.strip() == "" or not username:
           continue

        if event.EventCode == 7001 :
            typeevent = 'User-Connect'
        else:
            typeevent = 'User-Disconnect'

        realdate = event.TimeGenerated.split('.')[0]
        humandate = datetime.strptime(realdate, '%Y%m%d%H%M%S')

        found = False
        for u in list(WAPT.read_audit_data_set(typeevent,username)):
            if u[0] == str(humandate):
                found = True
        if found:
            continue

        WAPT.write_audit_data(typeevent,username,value = str(humandate), keep_days=365,max_count=9999)

    return "OK"
Es un fragmento de código que comencé pero nunca terminé

Re: WAPT.escribir_datos_de_auditoría_si_han_cambiado

Publicado: 20 de septiembre de 2024 - 13:59
por Vincent Moisan
Gracias por la respuesta, funciona.

Re: WAPT.escribir_datos_de_auditoría_si_han_cambiado

Publicado: 26 de septiembre de 2024 - 11:13 a. m.
por dcardon
Hola Vincent,

gracias por tus comentarios. :-) Marco el tema como RESUELTO.

Hasta pronto,

Denis.