#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()} } }
这是剧本。 它检测并删除在超过14天未login到系统的系统上的域configuration文件(域是EXP
),并且它工作 。
但是,我开始接受投诉,说脚本正在删除本地帐户,特别是一个本地帐户。 假设这是不可能的(我有完美的脚本技能,对吗?),我看了看,运行脚本,并看到所有本地帐户的configuration文件夹仍然存在C:\ Users(Win 7工作站)下。 假索赔。
快进,多投诉。 我再次运行脚本,结果相同。 但是,这次我注意到一个特定的本地帐户的registry项已经不存在了(这是投诉的起因)。 我在那之后逐行运行脚本,打破了$Users | foreach{
$Users | foreach{
loop,确保它抓取正确的sids,并在正确的SID上运行Win32_UserProfile.delete()
。
然而,当运行脚本(这是一个调度任务,所以我从那里“手动”运行),相同的本地SID被删除,其余所有剩余的,这增加了混乱; 因为在观看动作的时候,我看到C:\ Users下的域用户文件夹立即删除,但是本地用户仍然存在,增加了混淆。
起初我以为这是局限于一个本地configuration文件, 但是在打开registry后,我发现HKEY_USERS只有几个条目:
我的域帐户从远程连接,和
即使configuration文件没有,我loginvalidation帐户的问题帐户仍然存在。
所有其他SID,本地或域名,都没有了 。 它仅限于一个本地用户帐户。
这样做的效果当然是,当某人login本地帐户时,其个人资料文件夹中的所有内容都将被覆盖,但是观看脚本运行并删除域帐户的所有configuration文件夹而不是本地帐户有点误导。
更新
我删除和更新上面的信息。 此外,图片是值得千言万语,所以在这里:
为了澄清,我想知道为什么本脚本运行时脚本被删除。 这似乎是两者之一
没有本地帐户将被删除(脚本按预期运行)
所有本地configuration文件将被删除(脚本不歧视一个本地帐户,即使这意味着它也不能按预期运行)。
不太确定这将如何得到当地人…除非 – 匹配“EXP \\”在某种程度上不像预期的那样。 工作站名称中是否包含“EXP”? 是否有可能使用本地帐户进行本地login并保持login超过14天? 你的14天窗口可能有点过于激进。
您的代码正在利用包含大部分相同信息的2个不同的WMI提供程序。 build议一个更简单的循环(单个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() } }