我正在尝试创建一个清理2008-R2服务器上临时配置文件的脚本。
奇怪的是我很肯定我在假期之前工作正常,现在假期后剧本不起作用了:(。
剧本:
$keys = ls "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*.bak"
foreach ($key in $keys){
$sid = $key.name | select-string -Pattern 'S-\d-\d+-(\d+-){1,14}\d+' | out-string
$sid = ($sid).Split('\')[6]
$sid = ($sid).Split('.')[0]
$profile = get-wmiobject win32_userprofile -computername localhost | where-object {$_.SID -eq $sid}
$profile.Delete()
}
如果我执行该操作,或对该删除方法进行任何形式的修改,我会得到:
Exception calling "Delete" with "0" argument(s): ""
At C:\temp\remove_temp_profiles.ps1:7 char:18
($profile).Delete <<<< ()
CategoryInfo : NotSpecified: (:) [], MethodInvocationException
FullyQualifiedErrorId : DotNetMethodException
如果我跑了:
get-wmiobject win32_userprofile | get-member
我可以看到删除方法不。无论这意味着什么,它都应该被“隐藏”。
除了删除不起作用外,其余的脚本完美运行(正则表达式是另一场战斗哈哈!)
我也改为尝试使用remove-wmiobject
。但是它会导致错误:
Remove-WmiObject :
At C:\temp\remove_temp_profiles.ps1:7 char:28
+ $profile | remove-wmiobject <<<<
+ CategoryInfo : InvalidOperation: (:) [Remove-WmiObject], COMException
+ FullyQualifiedErrorId : RemoveWMICOMException,Microsoft.PowerShell.Commands.RemoveWmiObject
我花了很多年龄和谷歌搜索并尝试不同的东西,所有解决方案似乎都是“使用$variable.Delete()
并且它工作正常”。我不知道如何编程(只有基本脚本)为我的新意而道歉。
答案 0 :(得分:2)
这可能是因为仍然认为配置文件已加载。您可以通过查看已加载属性来验证这一点。您还应该考虑使用-Filter
参数,而不是将所有内容传递给Where-Object。
$keys = ls "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*.bak"
foreach ($key in $keys){
$sid = $key.name | select-string -Pattern 'S-\d-\d+-(\d+-){1,14}\d+' | out-string
$sid = ($sid).Split('\')[6]
$sid = ($sid).Split('.')[0]
$profile = get-wmiobject win32_userprofile -computername localhost -Filter "SID -eq '$sid' AND NOT Loaded='True'"
$profile.Delete()
}
如果您只想查看配置文件是否仍然加载:
Get-WMIObject win32_userprofile -computername localhost -Filter "Loaded='True'" |
Select SID,LocalPath,Loaded