Avatar of ivan rosa
ivan rosa
Flag for United States of America asked on

deleting profiles while skipping admin

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
PowershellWindows BatchScripting Languages

Avatar of undefined
Last Comment
ivan rosa

8/22/2022 - Mon
Jose Gabriel Ortega Castro

$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 Vermaak

ivan rosa

ASKER
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 ...
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
ivan rosa

ASKER
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 Castro

$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.
ivan rosa

ASKER
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

⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Jose Gabriel Ortega Castro

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) ?
ASKER CERTIFIED SOLUTION
ivan rosa

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Shaun Vermaak

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
ivan rosa

ASKER
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...
Experts Exchange has (a) saved my job multiple times, (b) saved me hours, days, and even weeks of work, and often (c) makes me look like a superhero! This place is MAGIC!
Walt Forbes