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

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

114757
Lösung 114757 29.12.2015 aktualisiert um 11:16:42 Uhr
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 29.12.2015 um 10:56:49 Uhr
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
Lösung 114757 29.12.2015 aktualisiert um 11:16:46 Uhr
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 29.12.2015 um 11:17:33 Uhr
Goto Top
Ok,

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

Gracias