deleting profiles while skipping admin

ivan rosa
ivan rosa used Ask the Experts™
on
Hello folks,
i have created the following script to remove profiles from PCs, however what change would i make to skip the administrator profile?

$CLIENT = Get-Content "c:\Temp\computers.txt"
 
foreach($PC in $CLIENT){
    # Testing PC connectivity
    if(Test-Connection $PC -Count 1 -Quiet){
        # Gathering users from c:\users
        foreach($PCuser in (Get-ChildItem "\\$pc\c$\users" -Directory)){
            # delete  recursively
            RD "\\$PC\c$\Users\$($pcuser.name)\Desktop\*.*"
            RD "\\$PC\c$\Users\$($pcuser.name)\Downloads\*.*"
            RD "\\$PC\c$\Users\$($pcuser.name)\Documents\*.*"
            RD "\\$PC\c$\Users\$($pcuser.name)\Music\*.*"
            RD "\\$PC\c$\Users\$($pcuser.name)\Pictures\*.*"
            RD "\\$PC\c$\Users\$($pcuser.name)\Videos\*.*"
        }
    }else{
        Write-Warning "$PC is offline"
    }
} 

Open in new window


or if anybody has a a batch that'd be great too

Thanks for looking
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Jose Gabriel Ortega CastroCEO Faru Bonon IT /Top Rated Freelancer on Upwork / Photographer
Awarded 2018
Distinguished Expert 2018

Commented:
$CLIENT = Get-Content "c:\Temp\computers.txt"
function Remove-Recursively{
    [CmdletBinding()]
    param(
        [Parameter(position=0,Mandatory=$true)]$Path
    )
    BEGIN{}
    PROCESS{
        #Get Files and remove them
        $Files = [System.IO.Directory]::GetFiles($Path)
        $ProfileFolders = [System.IO.Directory]::GetDirectories($Path)
        if($ProfileFolders.Count -gt 0){
            foreach($profileFolder in $ProfileFolders){
                Remove-recursively -path $profilefolder
            }
        }
        

        if($Files.Count -gt 0){
            foreach($file in $Files){
                [System.IO.File]::Delete($file)
            }
        }
        [System.IO.Directory]::Delete($Path)
    }
    END{}
}
 
foreach($PC in $CLIENT){
    # Testing PC connectivity
    if(Test-Connection $PC -Count 1 -Quiet){
        # Gathering users from c:\users
        $Folders= [System.IO.Directory]::GetDirectories("\\$pc\C$\users")
        $Filtered = $Folders | where { $_ -notmatch "Admin"}

        foreach($PCuser in $Filtered){
            Remove-Recursively -path $pfolder
        }
    }else{
        Write-Warning "$PC is offline"
    }
} 

Open in new window

Shaun VermaakSenior Consultant
Awarded 2017
Distinguished Expert 2018

Commented:

Author

Commented:
Hi Jose, let's make it easier, what about to delete the entire profiles while skipping the admin & defaults?

unfortunate i tried your script and it gave me the error below
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively
 
Remove-Recursively : Cannot bind argument to parameter 'Path' because it is null.
At C:\Users\johndoe\Desktop\removeprofile2.ps1:37 char:38
+             Remove-Recursively -path $pfolder
+                                      ~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Remove-Recursively], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Remove-Recursively

Open in new window


@shaun, GPO would it sounded good, thought this project is a temporary ...
Bootstrap 4: Exploring New Features

Learn how to use and navigate the new features included in Bootstrap 4, the most popular HTML, CSS, and JavaScript framework for developing responsive, mobile-first websites.

Author

Commented:
ok so i re-edited the script with vision of just deleting the entire profile while skipping the default accounts but for some reason it's not deleting the files ...
$CLIENT = Get-Content "c:\Temp\computers.txt"

foreach($PC in $CLIENT){
    # Testing PC connectivity
    if(Test-Connection $PC -Count 1 -Quiet){
        # Gathering users from c:\users
        foreach($PCuser in (Get-ChildItem "\\$pc\c$\users" -Directory)){
            # delete  recursively
            Where ($PCuser -ne 'Default' -or $PCuser -ne 'Administrator' -ne $PCuser -ne 'Public') | RD "\\$PC\c$\Users\$PCuser\" -Force -Recurse
            echo "from this $PC all of this user was deleted $PCuser"
        }
    }else{
        Write-Warning "$PC is offline"
    }
}

Open in new window

can anybody kindly take a look of what am i doing wrong?
Jose Gabriel Ortega CastroCEO Faru Bonon IT /Top Rated Freelancer on Upwork / Photographer
Awarded 2018
Distinguished Expert 2018

Commented:
$CLIENT = Get-Content "c:\Temp\computers.txt"
function Remove-Recursively{
    [CmdletBinding()]
    param(
        [Parameter(position=0,Mandatory=$true)]$Path
    )
    BEGIN{}
    PROCESS{
        #Get Files and remove them
        $Files = [System.IO.Directory]::GetFiles("$Path")
        $ProfileFolders = [System.IO.Directory]::GetDirectories("$Path")
        if($ProfileFolders.Count -gt 0){
            foreach($profileFolder in $ProfileFolders){
                Remove-recursively -path "$profilefolder"
            }
        }
        

        if($Files.Count -gt 0){
            foreach($file in $Files){
                [System.IO.File]::Delete($file)
            }
        }
        [System.IO.Directory]::Delete("$Path")
    }
    END{}
}
 
foreach($PC in $CLIENT){
    # Testing PC connectivity
    if(Test-Connection $PC -Count 1 -Quiet){
        # Gathering users from c:\users
        $Folders= [System.IO.Directory]::GetDirectories("\\$pc\C$\users")
        $Filtered = $Folders | where { $_ -notmatch "Admin"}

        foreach($PCuser in $Filtered){
            Remove-Recursively -path "$pfolder"
        }
    }else{
        Write-Warning "$PC is offline"
    }
} 

Open in new window


Try this one and check if you got any errors.
it was not working because you gave a null path.
That was all it was complaining for.

Author

Commented:
thanks, buddy, although I got me an even bigger error log.

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetFiles" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:10 char:9
+         $Files = [System.IO.Directory]::GetFiles("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "GetDirectories" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:11 char:9
+         $ProfileFolders = [System.IO.Directory]::GetDirectories("$Pat ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Exception calling "Delete" with "1" argument(s): "The path is not of a legal form."
At C:\Temp\removeprofiles.ps1:24 char:9
+         [System.IO.Directory]::Delete("$Path")
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

Open in new window

Jose Gabriel Ortega CastroCEO Faru Bonon IT /Top Rated Freelancer on Upwork / Photographer
Awarded 2018
Distinguished Expert 2018

Commented:
I'd need to know what is in the variable. Can I see it ? teamviewer maybe?
what is the path you're looking form? it is supposed to run in a local path. are you running it in a network path (\\server\folder) ?
thanks for your efforts Jose I was actually running it from the same "c:\test\" folder just like where my computers.txt file was...
with that said though I corrected my original one and actually got it working. I even was able to add more users to avoid.
ps. it might not be a look a little messy though

$CLIENT = Get-Content "c:\Temp\computers.txt"
foreach($PC in $CLIENT) 
{
    if(Test-Connection $PC -Count 1 -Quiet) 
    {
        foreach($PCuser in (Get-ChildItem "\\$pc\c$\users" -Directory)) 
        {
            if ($PCuser -notmatch "Public") 
            {
                if ($PCuser -notmatch "Administrator") 
                {
                    if ($PCuser -notmatch "Default")
                    {
                        #WRITE This is the user $PCuser - and pc $PC
                        Remove-Item -Recurse -Force -Verbose -Path "\\$PC\C$\Users\$PCuser\"
                    }
                    
                } 
            }
    
        }
    } else
        {
            Write-Warning "$PC is offline"
        }
}
 

Open in new window

Shaun VermaakSenior Consultant
Awarded 2017
Distinguished Expert 2018

Commented:
You will still delete admin profiles because admin could have been renamed or suffixed with a .COMPUTERNAME or a .DOMAINNAME.

I suggest you enumerate HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Author

Commented:
this is best to put in practice with folders within folders while voiding targets. thought i would really advise to test it first make sure if it's used for profiling to make sure, Temporary profile doesn't pop up...

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial