win32_userprofile删除方法出错?

时间:2014-08-13 23:39:54

标签: powershell

我正在尝试创建一个清理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()并且它工作正常”。我不知道如何编程(只有基本脚本)为我的新意而道歉。

1 个答案:

答案 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