#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()}
}
}
这就是脚本。它会检测并删除领域配置文件(域为EXP
),在超过 14 天未登录系统的系统上,并且作品。
但是,我开始收到投诉,称该脚本正在删除本地帐户,特别是一个本地帐户。我以为这是不可能的(我有完美的脚本技能,对吧?),我查看了一下,运行了脚本,发现所有本地帐户的配置文件文件夹仍然存在于 C:\Users(Win 7 工作站)下。虚假声明。
快进,更多投诉。我再次运行脚本,结果相同。但是,这次我注意到一个特定本地帐户的注册表项不见了(投诉源于此)。之后我逐行运行脚本,打破循环$Users | foreach{
,确保它抓取正确的 SID 并Win32_UserProfile.delete()
在正确的 SID 上运行,它确实如此。
但是,在运行脚本时(这是一个计划任务,因此我从那里“手动”运行它),相同的本地 SID 会被删除,而其余的都保留下来,这增加了混乱;因为在观察操作时,我看到 C:\Users 下的域用户文件夹立即被删除,但本地文件夹保留下来,这增加了混乱。
起初我以为这仅限于单个本地配置文件,但打开注册表后我注意到 HKEY_USERS 只有几个条目:
我的域帐户无法远程连接,并且
我登录来验证的问题账户帐户仍然存在,尽管轮廓没有。
所有其他 SID(本地或域)都是消失了.仅限于单个本地用户帐户。
这样做的效果当然是,当有人登录本地账户时,一切在他们的配置文件文件夹中被覆盖,但是观察脚本运行并删除域帐户但不删除本地帐户的所有配置文件文件夹有点误导。
更新
我删除并更新了上述信息。另外,图片胜过千言万语,因此这里是:
- 个人资料列表注册表项和 C:\Users前运行脚本。部分空白的 SID 与域帐户绑定,突出显示的配置文件文件夹与域用户绑定:
- 同样的镜头,后脚本运行。剩下一个域 SID,这是我的:
为了澄清起见,我想知道为什么此脚本运行时,正在删除本地帐户。似乎
不会删除任何本地帐户(脚本按预期运行)
全部本地配置文件将被删除(脚本不会歧视一本地帐户,即使这也意味着没有按预期运行)。
答案1
不太确定这将如何获取本地帐户...除非 -match“EXP\\”的行为不符合预期。工作站名称中是否包含“EXP”?这些本地帐户是否可能用于本地登录并保持登录状态超过 14 天?您的 14 天窗口可能有点太激进了。
您的代码利用了 2 个不同的 WMI 提供程序,它们包含的信息基本相同。建议使用更简单的循环(单个 WMI 查询),其中您还(#1)仅匹配那些 SID 与域 SID 匹配的帐户,并且如果问题仍然存在,还可以写入一些日志以便更轻松地诊断问题。将 $sidPrefix 的值更改为与您的域的值匹配。
$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()
}
}