{"id":257161,"date":"2024-05-21T09:32:43","date_gmt":"2024-05-21T09:32:43","guid":{"rendered":"https:\/\/www.ninjaone.com\/?post_type=script_hub&#038;p=257161"},"modified":"2024-05-21T09:32:43","modified_gmt":"2024-05-21T09:32:43","slug":"supervisar-el-ultimo-inicio-de-sesion-de-un-usuario","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/es\/script-hub\/supervisar-el-ultimo-inicio-de-sesion-de-un-usuario\/","title":{"rendered":"C\u00f3mo supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario con PowerShell"},"content":{"rendered":"<p>En la gesti\u00f3n de TI moderna, una de las tareas cr\u00edticas consiste en supervisar las cuentas de usuario, sobre todo para identificar las inactivas. Esta empresa es algo m\u00e1s que una simple limpieza, y es que set\u00e1 directamente relacionada con la seguridad, el cumplimiento de la normativa y la gesti\u00f3n eficaz de los recursos. Hoy nos adentramos en un script de PowerShell que\u00a0permite <strong>supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario<\/strong>.<\/p>\n<h2>Antecedentes<\/h2>\n<p>El script proporcionado est\u00e1 dise\u00f1ado para identificar e informar sobre las cuentas de usuario en funci\u00f3n de su \u00faltimo inicio de sesi\u00f3n, en particular aquellas que no se han utilizado durante un periodo de tiempo especificado. Garantizar la identificaci\u00f3n y gesti\u00f3n de las cuentas no utilizadas es crucial para los profesionales de TI y los <a href=\"https:\/\/www.ninjaone.com\/es\/que-es-un-msp\">proveedores de servicios gestionados (MSP)<\/a>. Las cuentas inactivas plantean riesgos de seguridad y a menudo se convierten en objetivos f\u00e1ciles para los ciberdelincuentes. Adem\u00e1s, para las organizaciones sujetas a normativas de cumplimiento, el seguimiento de la actividad de los usuarios y la desactivaci\u00f3n de las cuentas no utilizadas puede ser un requisito.<\/p>\n<h2>El script para supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\">#Requires -Version 5.1\r\n\r\n&lt;#\r\n.SYNOPSIS\r\n    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 90 days or a custom amount of days.\r\n.DESCRIPTION\r\n    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 90 days or a custom amount of days.\r\n.EXAMPLE\r\n    No parameters needed.\r\n    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 90 days.\r\n.EXAMPLE\r\n    -IncludeDisabled\r\n    Returns exit code of 1 if any Enabled or Disabled accounts that haven't been logged in over 90 days.\r\n.EXAMPLE\r\n    -Days 60\r\n    Returns exit code of 1 if any Enabled accounts that haven't been logged in over 60 days.\r\n.EXAMPLE\r\n    -Days 60 -IncludeDisabled\r\n    Returns exit code of 1 if any Enabled or Disabled accounts that haven't been logged in over 60 days.\r\n.OUTPUTS\r\n    None\r\n.NOTES\r\n    Minimum OS Architecture Supported: Windows 7, Windows Server 2012\r\n    Exit code 1: Found users that haven't logged in over X days and are enabled.\r\n    Exit code 2: Calling \"net.exe user\" or \"Get-LocalUser\" failed.\r\n    Release Notes:\r\n    Initial Release\r\nBy using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https:\/\/www.ninjaone.com\/terms-of-use.\r\n    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. \r\n    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. \r\n    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. \r\n    Warranty Disclaimer: The script is provided \u201cas is\u201d and \u201cas available\u201d, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. \r\n    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. \r\n    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. \r\n    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).\r\n.COMPONENT\r\n    ManageUsers\r\n#&gt;\r\n\r\n[CmdletBinding()]\r\nparam (\r\n    [Parameter()]\r\n    [int]\r\n    $Days = 90,\r\n    [Parameter()]\r\n    [switch]\r\n    $IncludeDisabled\r\n)\r\n\r\nbegin {}\r\nprocess {\r\n    if ($Days -lt 0) {\r\n        # Change negative days to the expected positive days\r\n        $Days = 0 - $Days\r\n    }\r\n    $Accounts = if ($(Get-Command \"Get-LocalUser\").Name -like \"Get-LocalUser\") {\r\n        try {\r\n            Get-LocalUser | Select-Object Name, Enabled, SID, LastLogon\r\n        }\r\n        catch {\r\n            exit 2\r\n        }\r\n    }\r\n    else {\r\n        # Get users from net.exe user\r\n        $Data = $(net.exe user) | Select-Object -Skip 4\r\n        # Check if the command ran the way we wanted and the exit code is 0\r\n        if ($($Data | Select-Object -Last 2 | Select-Object -First 1) -like \"*The command completed successfully.*\" -and $LASTEXITCODE -eq 0) {\r\n            # Process the output and get only the users\r\n            $Users = $Data[0..($Data.Count - 3)] -split 's+' | Where-Object { -not $([String]::IsNullOrEmpty($_)) }\r\n            # Loop through each user\r\n            $Users | ForEach-Object {\r\n                # Get the Account active property look for a Yes\r\n                $Enabled = $(net.exe user $_) | Where-Object {\r\n                    $_ -like \"Account active*\" -and\r\n                    $($_ -split 's+' | Select-Object -Last 1) -like \"Yes\"\r\n                }\r\n                # Get the Last logon property\r\n                $LastLogon = $(\r\n                    $(\r\n                        $(net.exe user $_) | Where-Object {\r\n                            $_ -like \"Last logon*\"\r\n                        }\r\n                    ) -split 's+' | Select-Object -Skip 2\r\n                ) -join ' '\r\n                # Get the Password last set property\r\n                $PasswordLastSet = $(\r\n                    $(\r\n                        $(net.exe user $_) | Where-Object {\r\n                            $_ -like \"Password last set*\"\r\n                        }\r\n                    ) -split 's+' | Select-Object -Skip 3\r\n                ) -join ' '\r\n                # Output Name and Enabled almost like how Get-LocalUser displays it's data\r\n                [PSCustomObject]@{\r\n                    Name      = $_\r\n                    Enabled   = if ($Enabled -like \"*Yes*\") { $true }else { $false }\r\n                    LastLogon = if ($LastLogon -like \"*Never*\") { [DateTime]::Parse($PasswordLastSet) } else { [DateTime]::Parse($LastLogon) }\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            exit 2\r\n        }\r\n    }\r\n    $Output = $Accounts | Where-Object {\r\n        if ($IncludeDisabled) {\r\n            $_.LastLogon -lt $(Get-Date).AddDays(0 - $Days)\r\n        }\r\n        else {\r\n            $_.Enabled -and $_.LastLogon -lt $(Get-Date).AddDays(0 - $Days)\r\n        }\r\n    }\r\n    $Output | Out-String | Write-Host\r\n    if ($null -ne $Output) {\r\n        exit 1\r\n    }\r\n}\r\nend {}<\/pre>\n<p>&nbsp;<\/p>\n\n<div class=\"in-context-cta\"><p style=\"text-align: center;\">Accede a m\u00e1s de 300 scripts en el Dojo de NinjaOne<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.ninjaone.com\/es\/prueba-gratuita-formulario\/\">Obt\u00e9n acceso<\/a><\/p>\n<\/div>\n<h2>An\u00e1lisis detallado<\/h2>\n<p>El script comienza estableciendo una duraci\u00f3n predeterminada de 90 d\u00edas para comprobar la inactividad. A continuaci\u00f3n, utiliza el cmdlet \u00abGet-LocalUser\u00bb o el comando \u00abnet.exe user\u00bb, en funci\u00f3n de lo que est\u00e9 disponible.<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\">Si el cmdlet \u00abGet-LocalUser\u00bb est\u00e1 presente, obtiene los detalles directamente.<\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"2\" data-aria-level=\"1\">Si no, recurre al comando \u00abnet.exe user\u00bb. Este comando recupera los datos y luego procesa el output para filtrar los detalles necesarios.<\/li>\n<\/ul>\n<p>La l\u00f3gica principal consiste en comprobar si el \u00faltimo inicio de sesi\u00f3n de cada usuario es anterior al umbral definido. Si se encuentra una coincidencia, se muestra y el script sale con el c\u00f3digo 1. Se utiliza un c\u00f3digo de salida 2 para las excepciones cuando se obtienen datos de usuario.<\/p>\n<h2>Posibles casos de uso<\/h2>\n<p>Imagina a Ana, una profesional de TI en una empresa mediana. Recientemente, la empresa se ha enfrentado a un peque\u00f1o fallo de seguridad. Tras el incidente, se le ha encargado a Ana que refuerce la seguridad. Una de las sugerencias ha sido comprobar peri\u00f3dicamente si hay cuentas inactivas y desactivarlas. Con este script para supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario, puede configurar una rutina mensual para obtener una lista de dichas cuentas, garantizando que el directorio de usuarios de la empresa permanece activo y seguro.<\/p>\n<h2>Comparaciones<\/h2>\n<p>Aunque el script emplea PowerShell, otro enfoque podr\u00eda consistir en consultar directamente Active Directory (si est\u00e1 disponible) para obtener los detalles de las cuentas de usuario. Pueden utilizarse herramientas como ADManager Plus o incluso el Usuarios y equipos de Active Directory (ADUC) integrado. Sin embargo, nuestro script para supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario ofrece una alternativa ligera, personalizable y gratuita.<\/p>\n<h2>FAQ<\/h2>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><strong>\u00bfY si quiero comprobar una duraci\u00f3n de inactividad diferente?<\/strong><br \/>\nPuedes personalizar el par\u00e1metro $Days.<\/li>\n<\/ul>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\"><strong>\u00bfEl script puede identificar tanto las cuentas habilitadas como las deshabilitadas?<\/strong><br \/>\nS\u00ed, utilizando el modificador -IncludeDisabled, el script puede recuperar tanto las cuentas activadas como las desactivadas.<\/li>\n<\/ul>\n<h2>Implicaciones<\/h2>\n<p>M\u00e1s all\u00e1 de la identificaci\u00f3n de cuentas inactivas, la implicaci\u00f3n m\u00e1s amplia de este script para supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario est\u00e1 relacionada con la seguridad inform\u00e1tica. Las cuentas inactivas pueden ser f\u00e1cilmente comprometidas, proporcionando acceso no autorizado. La comprobaci\u00f3n peri\u00f3dica de la inactividad de los usuarios y la adopci\u00f3n de las medidas oportunas pueden evitar posibles infracciones.<\/p>\n<h2>Recomendaciones<\/h2>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"1\" data-aria-level=\"1\">Prueba siempre el script en un entorno controlado antes de desplegarlo en una configuraci\u00f3n real.<\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"2\" data-aria-level=\"1\">Programa este script para que se ejecute peri\u00f3dicamente a fin de garantizar una supervisi\u00f3n continua.<\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Symbol&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;\uf0b7&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" data-aria-posinset=\"3\" data-aria-level=\"1\">Una vez detectadas las cuentas inactivas, toma las medidas oportunas, como desactivar la cuenta o notific\u00e1rselo al usuario o a su manager.<\/li>\n<\/ul>\n<h2>Reflexiones finales<\/h2>\n<p>Si bien el script para supervisar el \u00faltimo inicio de sesi\u00f3n de un usuario proporciona una soluci\u00f3n eficaz, integrar herramientas como <a href=\"https:\/\/www.ninjaone.com\/es\/\">NinjaOne<\/a> puede mejorar a\u00fan m\u00e1s las capacidades, automatizando las tareas y proporcionando un <a href=\"https:\/\/www.ninjaone.com\/es\/supervision-gestion-de-endpoints\/\">panel de control para una gesti\u00f3n centralizada<\/a>. Herramientas como NinjaOne est\u00e1n dise\u00f1adas para gestionar estas tareas de manera eficiente, garantizando que los profesionales de TI como Ana puedan centrarse en tareas m\u00e1s estrat\u00e9gicas, utilizando scripts como el anterior como parte de un conjunto de herramientas m\u00e1s amplio.<\/p>\n","protected":false},"author":35,"featured_media":144302,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"no","_lmt_disable":""},"operating_system":[4212],"use_cases":[4267],"class_list":["post-257161","script_hub","type-script_hub","status-publish","has-post-thumbnail","hentry","script_hub_category-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub\/257161","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/comments?post=257161"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media\/144302"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=257161"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/operating_system?post=257161"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/use_cases?post=257161"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}