O que está causando o dano colateral ao excluir perfis antigos?

3
#Get user names that have logged onto workstation
$Users = gwmi win32_networkloginprofile | where {$_.name -match "EXP\"} | where {$_.name -notmatch "srvtasksched"}


$Users | foreach{

    $Name = $_.Name
    $LastLogon = $_.LastLogon

    $LogonTime = [System.datetime]::ParseExact($LastLogon.Substring(0, $LastLogon.IndexOf(".")), "yyyyMMddHHmmss", [System.Globalization.DateTimeFormatInfo]::InvariantInfo)

    if($(Get-Date).Subtract($LogonTime).TotalDays -ge 14)
    {
        #User hasn't logged into workstation in over 2 weeks
        #Get profile path
        $UserSID = $(New-Object System.Security.Principal.NTAccount($Name)).Translate([System.Security.Principal.SecurityIdentifier]).Value
        $UserRegKey = GCI 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' | where {$_.Name -match $UserSID}

        $ProfilePath = $(Get-ItemProperty $UserRegKey.PSPath -Name ProfileImagePath).ProfileImagePath

        Write-Host "Deleting User $Name"
        gwmi win32_userprofile | where {$_.SID -eq $UserSID} | foreach {$_.Delete()}

    }

}

Esse é o roteiro. Ele detecta e exclui perfis de domínio (o domínio é EXP ) em sistemas que não fazem login no sistema há mais de 14 dias, e funciona .

No entanto, comecei a receber reclamações de que o script está excluindo contas locais, uma conta local em particular. Assumindo que isso era impossível (eu tenho habilidades de script perfeitas, certo?), Dei uma olhada, executei o script e vi que as pastas de perfil de todas as contas locais ainda estavam presentes em C: \ Users (Win 7 estações de trabalho). Reivindicação falsa.

Avanço rápido, mais reclamações. Eu corri o script novamente, os mesmos resultados. No entanto, desta vez, notei que a entrada do registro para uma conta local específica tinha desaparecido (a que as reclamações são provenientes). Eu executei o script linha por linha depois disso, dividindo o loop $Users | foreach{ , certificando-me de que ele pega os sids corretos e executa Win32_UserProfile.delete() nos SIDs corretos.

No entanto, ao executar o script (é uma tarefa sched, então eu o executei 'manualmente' de lá), os mesmos SIDs locais são excluídos e todos os demais permanecem, o que aumenta a confusão; porque ao assistir a ação, vejo as pastas de usuários de domínio em C: \ Users serem excluídas imediatamente, mas as locais permanecem, aumentando a confusão.

No começo, eu achei que isso estava limitado a um único perfil local, no entanto, depois de abrir o registro, notei que o HKEY_USERS tinha apenas algumas entradas:

  1. Minha conta de domínio se conecta remotamente e

  2. A conta do problema em que eu me conectei para verificar a conta ainda existia, mesmo que o perfil não.

Todos os outros SIDs, locais ou de domínio, foram sumidos . Está limitado a uma única conta de usuário local.

Os efeitos disso, claro, é que quando alguém faz login em uma conta local, tudo em sua pasta de perfil é sobrescrito, mas o script é executado e exclui todas as pastas de perfil de contas de domínio, mas não local contas é um pouco enganador.

Atualizar

Eu removi e atualizei as informações acima. Além disso, as imagens valem mais que mil palavras, então aqui vai:

  1. Disparo da chave de registro da lista de perfis e do script de execução C: \ Usuários antes . Os SIDs parcialmente em branco estão vinculados a contas de domínio e as pastas de perfil destacadas são para usuários do domínio:

  1. Filmagem do mesmo script após é executada. Um domínio SID saiu, que é meu:

Para esclarecimentos, quero saber por que uma conta local está sendo excluída quando esse script é executado. Parece que também

  1. Nenhuma conta local seria excluída (o script é executado como pretendido)

  2. Todos os perfis locais seriam excluídos (o script não discrimina uma conta local, mesmo que isso signifique que não executar como pretendido).

por MDMoore313 11.04.2014 / 22:39

1 resposta

2

Não tenho certeza de como isso seria obter os locais ... a menos que o -match "EXP \\" não esteja de alguma forma se comportando como esperado. As estações de trabalho contêm "EXP" no nome? É possível que essas contas locais sejam usadas para fazer logons locais e permanecer logado por mais de 14 dias? Sua janela de 14 dias pode ser um pouco agressiva demais.

Seu código está aproveitando dois provedores WMI diferentes que contêm basicamente as mesmas informações. Sugira um loop mais simples (consulta WMI única) em que você também (# 1) corresponde apenas às contas cujo SID corresponde ao SID do domínio e também grava alguns logs para diagnosticar problemas mais facilmente se continuar a haver problemas. Altere o valor de $ sidPrefix para corresponder ao seu domínio.

$sidPrefix = "S-1-5-99-999999999-"
gwmi Win32_UserProfile | WHERE {$_.sid -match $sidPrefix -AND $_.localpath -match "\users\" -AND $_.localpath -notmatch "srvtasksched" } | foreach {
    $name = split-path $_.localpath -leaf
    $lastUse = $_.lastusetime
    $LogonTime = [System.datetime]::ParseExact($lastUse.Substring(0, $lastUse.IndexOf(".")), "yyyyMMddHHmmss", [System.Globalization.DateTimeFormatInfo]::InvariantInfo)
    $now = get-date
    [int]$daysOld = $now.Subtract($LogonTime).TotalDays

    if($daysOld -ge 30)     {
        $info = "$name,$daysOld,$lastUse,$now"
        $info
        $info | out-file -append -enc ascii "C:\temp\profClean.csv"
        #$_.Delete()
    }
}
    
por 15.04.2014 / 15:54