什么是删除旧的configuration文件造成的附带损害?

#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只有几个条目:

  1. 我的域帐户从远程连接,和

  2. 即使configuration文件没有,我loginvalidation帐户的问题帐户仍然存在。

所有其他SID,本地或域名,都没有了 。 它仅限于一个本地用户帐户

这样做的效果当然是,当某人login本地帐户时,其个人资料文件夹中的所有内容都将被覆盖,但是观看脚本运行并删除域帐户的所有configuration文件夹而不是本地帐户有点误导。

更新


我删除和更新上面的信息。 此外,图片是值得千言万语,所以在这里:

  1. 运行脚本之前 ,请注意Profile List Reg Key和C:\ Users。 部分空白的SID绑定到域帐户,突出显示的configuration文件文件夹是域用户:

在这里输入图像说明

在这里输入图像说明

  1. 脚本运行之后拍摄。 一个领域SID离开了,这是我的:

在这里输入图像说明在这里输入图像说明

为了澄清,我想知道为什么本脚本运行时脚本被删除。 这似乎是两者之一

  1. 没有本地帐户将被删除(脚本按预期运行)

  2. 所有本地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() } }