2016-08-16 9 views
5

У меня есть этот скрипт профиля удаления, который запрашивает имя пользователя и удаляет его с каждого перечисленного компьютера. Элементы удаления и «пользователь вошли в систему» ​​работают, но часть, которая гласит: «Нет профилей, найденных на компьютере с именем $ UserName», нет. Я запустил свой сценарий на двух компьютерах и удалил мой профиль на обоих. Я воссоздал свой профиль (вошел в систему) и остался включенным в один, а не другой. Я запускаю его снова, и он дает мне сообщение «пользователь вошел в систему». Для другого компьютера он просто удалил профиль, не отображая сообщение «no profile found». Он просто пропускает его и ничего не отображает. Я изменил «if» на «else», но когда я это делаю, он отображает несколько строк «без профилей», включая компьютер, на котором он ранее удалял профиль.Powershell Удалить скрипт профиля - проверка ошибок не работает

Вот ссылка, на которой происходит большая часть сценария. http://techibee.com/powershell/powershell-script-to-delete-windows-user-profiles-on-windows-7windows-2008-r2/1556. Просматривая комментарии, у кого-то еще не было никаких проблем с этой частью.

У меня мало знаний в PowerShell, и это только что было собрано из других сценариев, которые я нашел на основе наших потребностей. Наша среда - Windows 7 и Server 2008 R2. Любая помощь очень ценится.

$UserName=Read-host "Please Enter Username: " 

$ComputerName= @("computer1","computer2") 


foreach($Computer in $ComputerName) {    
Write-Verbose "Working on $Computer"    
if(Test-Connection -ComputerName $Computer -Count 1 -ea 0) {    
    $Profiles = Get-WmiObject -Class Win32_UserProfile -Computer $Computer -ea 0    

    foreach ($profile in $profiles) {    
    $objSID = New-Object System.Security.Principal.SecurityIdentifier($profile.sid)    
    $objuser = $objsid.Translate([System.Security.Principal.NTAccount])    
    $profilename = $objuser.value.split("\")[1]    

    if($profilename -eq $UserName) {    
    $profilefound = $true    

    try {    
    $profile.delete()    
    Write-Host -ForegroundColor Green "$UserName profile deleted successfully on $Computer"    
    } catch {    
    Write-Host -ForegroundColor Yellow "Failed to delete the profile, $UserName logged on to $Computer"    
    }    
    }    
    }    

    if(!$profilefound) {    
    Write-Host -ForegroundColor Cyan "No profiles found on $Computer with Name $UserName"    
    }    
} else {    
    write-verbose "$Computer Not reachable"    
}    
} 
+0

'$ Profile' является автоматическим переменным, используйте другое имя переменного в цикле Еогеаспа (например,' Еогеасп ($ psprofile в $ профилях) {} ') –

+0

Спасибо за предложение.Я не знал об этом.Я пробовал, и он больше не дает выход вообще.Я вошел в систему на одном из компьютеров, и он должен дать выход, говоря, что" пользователь вошел в систему ». – DavidG

+0

В любом случае это не сработает, 'Win32_UserProfile' не имеет метода' delete() ' –

ответ

1

PowerShell имеет ряд automatic variables, что вы должны избегать повторного использования.

$Profile является одним из них, он содержит пути к скриптам профиля, применимым к текущему сеансу.

Используйте любое другое имя переменной (т.е. $userprofile.), И вы будете в порядке:

foreach ($userprofile in $profiles) {    
    $objSID = New-Object System.Security.Principal.SecurityIdentifier($userprofile.sid)    
    $objuser = $objsid.Translate([System.Security.Principal.NTAccount])    
    $profilename = $objuser.value.split("\")[1]    

    if($profilename -eq $UserName) { 
    $profilefound = $true 

    try { 
    $userprofile.delete() 
    Write-Host -ForegroundColor Green "$UserName profile deleted successfully on $Computer" 
    } catch { 
    Write-Host -ForegroundColor Yellow "Failed to delete the profile, $UserName logged on to $Computer" 
    } 
    } 
    } 
0

Я был в состоянии получить работу, изменяя «$ profilefound = $ ложь» и сделать его глобальным переменная. Кроме того, причина, по которой она отображала несколько строк «профиля, не найденного, когда я изменил его на оператор else, из-за того, где он был помещен. Он проверял каждый профиль на сервере. Когда он касался каждого профиля на компьютере, он отображался «профиль не найден».

Вот рабочий сценарий.

$UserName=Read-host "Please Enter Username: " 

$ComputerName= @("computer1","computer2") 
$profilefound = "false" 

foreach($Computer in $ComputerName) {    
Write-Verbose "Working on $Computer"    
if(Test-Connection -ComputerName $Computer -Count 1 -ea 0) {    
    $Profiles = Get-WmiObject -Class Win32_UserProfile -Computer $Computer -ea 0    

    foreach($userprofile in $profiles){    
    $objSID = New-Object System.Security.Principal.SecurityIdentifier($userprofile.sid)    
    $objuser = $objsid.Translate([System.Security.Principal.NTAccount])    
    $profilename = $objuser.value.split("\")[1]   

    if($profilename -eq $UserName) {    
    $profilefound = "true"   

    try {    
    $userprofile.delete()    
    Write-Host -ForegroundColor Green "$UserName profile deleted successfully on $Computer"    
    } catch {    
    Write-Host -ForegroundColor Yellow "Failed to delete the profile, $UserName logged on to $Computer"    
    }    
    }   
    } 

} 
else {    
    write-verbose "$Computer Not reachable"    
} 
if ($profilefound -eq "false") {    
    Write-Host -ForegroundColor Cyan "No profiles found on $Computer with Name $UserName"    
    }   
}