#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:
-
Minha conta de domínio se conecta remotamente e
-
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:
- 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:
- 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
-
Nenhuma conta local seria excluída (o script é executado como pretendido)
-
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).