skahle85
Goto Top

Powershell - NTFS Berechtigungen Konvertierungsfehler bei Invoke-Command

Hallo zusammen,

ich versuche gerade per invoke-command dem Admin Full Access auf einen Ordner zugeben.
Dabei erhalte ich folgende Fehlermeldung:

Der Parameter "Account" kann nicht gebunden werden. Der Wert "System.Management.Automation.PSCredential" vom Typ "System.Management.Automation.PSCredential" kann nicht in den Typ "Security2.IdentityReference2" konvertiert werden.

Da das Script individuell bleiben soll und für jeden Kunden geeignet ist wird alles aus einer Config.xml geladen weshalb ich die Account information NICHT direkt mitgeben kann.

kurz zum Script:
Ich habe ein Script mit GUI gebaut welches, zum einen User die in einer csv mit SamAccountName stehen löscht und zum anderen, deren Redirected Folders und Roaming Profiles vom Server löscht.

Informationen wie Server und Pfade kommen alle aus einer config.xml

Script begin (config laden):

################################
# - FUNCTION Choose config -   #
################################

function Read-OpenFileDialog([string]$WindowTitle, [string]$InitialDirectory, [string]$Filter = "All files (*.*)|*.*", [switch]$AllowMultiSelect)  

    {
    $openFileDialog = New-Object System.Windows.Forms.OpenFileDialog
    $openFileDialog.Title = $WindowTitle
    if (![string]::IsNullOrWhiteSpace($InitialDirectory)) { $openFileDialog.InitialDirectory = $InitialDirectory }
    $openFileDialog.Filter = $Filter
    if ($AllowMultiSelect) { $openFileDialog.MultiSelect = $true }
    $openFileDialog.ShowHelp = $true    # Without this line the ShowDialog() function may hang depending on system configuration and running from console vs. ISE.
    $openFileDialog.ShowDialog() > $null
    if ($AllowMultiSelect) { return $openFileDialog.Filenames } else { return $openFileDialog.Filename }
    }

####################################
# - END FUNCTION Choose config -   #
####################################
$xml = Read-OpenFileDialog -WindowTitle "Select Config File" -InitialDirectory 'C:\' -Filter "XML Files (*.xml)|*.xml"  
[xml]$ConfigFile = Get-Content $xml
$cred = Get-Credential

####################################
# - Admin User for Folder Rights - #
####################################

$AdminUser = @{
    Account = $ConfigFile.Settings.User.Admin
    }

########################################
# - END Admin User for Folder Rights - #
########################################

NTFS Berechtigungen ändern
$RDF = Redirected Folders
$RPF = Roaming Profiles:

####################################
# - FUNCTION Delete User Profile - #
####################################
function delUserProfile
{
Begin
  {
        Log-Write -LogPath $LogFile -LineValue "###################################"  
        Log-Write -LogPath $LogFile -LineValue "# Deleting User Roaming Profiles: #"  
        Log-Write -LogPath $LogFile -LineValue "###################################"  
  }
Process
{
Try
    {
         
         IMPORT-CSV $DropDownDelUserProfile.SelectedItem.FullName |
         ForEach-Object{
         
         $outputbox.Text +="`r`n"  
         $outputBox.text += Invoke-Command @ServerSettings -Credential $cred -ArgumentList ($_,$RDFSettings,$RPFSettings,$AdminUser) -ScriptBlock{
         Param($User,$RDF,$RPF,$AdminUser)
         ("User entfernt: "+$user.SamAccountName)  
         $profilePath = $RDF.Item("Path") + $user.SamAccountName  
         $profilePath2 = $RPF.Item("Path") + $user.SamAccountName + ".V2"  
         Add-NTFSAccess -Path $profilePath -AccessRights FullControl -Account $AdminUser
         Remove-Item -Path $profilePath -Recurse -Force
         Remove-Item -Path $profilePath2 -Recurse -Force
        } -ErrorAction SilentlyContinue -ErrorVariable ErrDelProfile
         #Log $ErrDelProfile     
      }
    }
catch
    {
     Log-Error -LogPath $LogFile -ErrorDesc $_.Exception -ExitGracefully $True
     Break
    }
}
End
    {
      If($?){
        Log-Write -LogPath $LogFile -LineValue " "  
        Log-Write -LogPath $LogFile -LineValue $outputBox.Text
        Log-Write -LogPath $LogFile -LineValue $ErrDelProfile
        Log-Write -LogPath $LogFile -LineValue " "  
        Log-Write -LogPath $LogFile -LineValue "finished Process"  
        Log-Write -LogPath $LogFile -LineValue "----------------"  
        Log-Write -LogPath $LogFile -LineValue " "  
              }
  }
}

Hoffe ihr könnt mir folgen. Gerne Fragen wenn Fragen oder ? entstanden sind.

Vielen Dank
Sebastian

Content-ID: 291835

Url: https://administrator.de/contentid/291835

Printed on: December 5, 2024 at 22:12 o'clock

114757
Solution 114757 Dec 29, 2015 updated at 10:16:42 (UTC)
Goto Top
Moin,
ganz klar, dein Problem ist hier nicht Invoke-Command sondern der Parameter -Account welchem du mit $AdminUser eine Variable des Typ hashtable übergibst und das ist falsch.
Also schreibe den Inhalt der Variablen so
$AdminUser = $ConfigFile.Settings.User.Admin
Dann ist auch das CMDlet Add-NTFSAccess zufrieden, denn das akzeptiert nur Strings für den Parameter Account.
Siehe: http://blogs.technet.com/b/heyscriptingguy/archive/2014/11/22/weekend-s ...

Gruß jodel32

p.s. und bitte nutze in Zukunft Codetags für das Posten von Quellcode, denn sonst gehen Sonderzeichen verloren! Danke.
skahle85
skahle85 Dec 29, 2015 at 09:56:49 (UTC)
Goto Top
Hallo jodel32,

Danke für deine Antwort und sorry fürs code nicht markieren. Hab das mal fix berichtigt... Kann ja keiner ertragen den Beitrag.

Mit der Übergabe war ich auch schon soweit, lieferte mir allerdings kein Ergebnis. An welcher Stelle sollte denn die Variable übergeben werden?
114757
Solution 114757 Dec 29, 2015 updated at 10:16:46 (UTC)
Goto Top
Zitat von @skahle85:
Mit der Übergabe war ich auch schon soweit, lieferte mir allerdings kein Ergebnis. An welcher Stelle sollte denn die Variable übergeben werden?
Du musst nur die Deklaration ändern Zeile 5-7

Hast du den Link gelesen, dort steht was Add-NTFSAccess an Parametern und in welchen Format es diese erwartet, was ist also nicht klar ???
Keine Hashtable sondern simpler Account-String
DOM\User
skahle85
skahle85 Dec 29, 2015 at 10:17:33 (UTC)
Goto Top
Ok,

ab und zu sollte man die Powershell ISE neustarten. Danach läuft es wie gewünscht!!!

Gracias