Hallo zusammen,
ich habe ein Problem mit der Powershell in Kombination mit Autoit. Ich möchte mir über Powershell alle expliziten Rechte eines Benutzers auslesen und diese in einem Textfile speichern.
Hierzu habe ich folgenden Code im Internet gefunden und angepasst:
$path = "\\server\d$\daten"
$list = get-childitem $path |get-childitem |where {$_.Psiscontainer}|foreach-object {$_.fullname}
$ntfs = $list | foreach{$a = $_; (get-acl $_).access|format-list IdentityReference,@{label="Name"; expression={$a} } }
$ntfs >> C:\Users\testuser\Desktop\temp_user.txt
Das Problem ist, dass ich hier nur eine Liste erstellt kriege mit ALLEN Berechtigungen des gesamten Fileservers, was ich ja nicht möchte. Naja, Problem erkannt und getestet. Das kam dabei raus:
Spoiler anzeigen
Func _conFolderShow($iWo)
Switch $iWo
;Ordnerberechtigungen User
Case 0
local $input = InputBox("", "Bitte Geben Sie die Freigabe ein: ")
;Erstellen des Powershell Skriptes
FileWriteLine(@ScriptDir & "\folder.ps1", '$path = "' & $input & '"')
FileWriteLine(@ScriptDir & "\folder.ps1", '$list = get-childitem $path |get-childitem |where {$_.Psiscontainer}|foreach-object {$_.fullname}')
FileWriteLine(@ScriptDir & "\folder.ps1", '$ntfs = $list | foreach{$a = $_; (get-acl $_).access|format-list IdentityReference,@{label="Name"; expression={$a} } }')
FileWriteLine(@ScriptDir & "\folder.ps1", '$ntfs >> ' & @ScriptDir & '\temp_user.txt')
local $1 = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -command "
local $2 = ". "
local $3 = "'" & @ScriptDir & "\folder.ps1'"
While Not FileExists(@ScriptDir & "\folder.ps1")
Sleep(50)
WEnd
;Ausführen des Skriptes als Domain Admin
RunAs($frmDom_sUser, $frmDom_sDomain, $frmDom_sPassword, 2, $1 & $2 & $3, "", @SW_HIDE)
;Auslesen des Benutzernamen aus der Liste der User in der GUI
local $aUser = _GUICtrlListBox_GetSelItemsText($Ber_lstUserWahl)
If UBound($aUser) - 1 < 2 Then
If UBound($aUser) - 1 < 1 Then
MsgBox(0, "", "Bitte wählen Sie einen Benutzer aus!")
Else
_ArraySort($aUser, 0, 1)
_ArrayDelete($aUser, 0)
; SamAccountName des Users aus der Liste zur weiteren Verarbeitung
$sUser = _AD_GetObjectsInOU("", "(&(objectcategory=person)(displayname=" & $aUser[0] & "))", 2, "SamAccountName")
_FolderShowFilter($sUser[1])
EndIf
Else
MsgBox(0, "", "Bitte nur einen Benutzer auswählen!")
EndIf
;Ordnerberechtigungen Gruppen
Case 1
EndSwitch
EndFunc ;==> _conFolderShow($iWo)
Func _FolderShowFilter($user)
;Warten bis das Powershell Skript ausgeführt wurde
While Not FileExists(@ScriptDir & "\temp_user.txt")
Sleep(50)
WEnd
;Einlesen der Berechtigungen in ein Array
local $aWhole = FileReadToArray(@ScriptDir & "\temp_user.txt")
;frmDom_sDNS in der Form DC=Domain,DC=local
local $aDnsShort = StringSplit(StringTrimLeft($frmDom_sDNS, 3), ",")
;Löschen der leeren Zeilen aus dem Array
For $i = UBound($aWhole) - 1 To 0 Step - 1
If $aWhole[$i] = "" Then _ArrayDelete($aWhole, $i)
Next
If FileExists(@ScriptDir & "\auswertung_" & $user & ".txt") Then FileDelete(@ScriptDir & "\auswertung_" & $user & ".txt")
For $i = 0 To UBound($aWhole) - 1 Step 2
; Kürzen der Berechtigung auf den SamAccountNamen
local $sUserShorten = StringRight($aWhole[$i], (StringLen(StringTrimLeft($aWhole[$i], 20)) - StringLen($aDnsShort[1]) - 1))
$aWhole[$i] = $sUserShorten
; Eintragen der Benutzernamen in die Datei auswertung_username.txt
If StringLeft($sUserShorten, 1) <> "\" And $sUserShorten <> "" And $sUserShorten = $user Then
If FileExists(@ScriptDir & "\auswertung_" & $user & ".txt") Then
If StringLeft(FileReadLine(@ScriptDir & "\auswertung_" & $user & ".txt", 1), StringLen($user)) = $user Then
FileWriteLine(@ScriptDir & "\auswertung_" & $user & ".txt", "Berechtigungen von " & $sUserShorten & ":" & @CRLF)
FileWriteLine(@ScriptDir & "\auswertung_" & $user & ".txt", StringTrimLeft($aWhole[$i+1], 20))
Else
FileWriteLine(@ScriptDir & "\auswertung_" & $user & ".txt", StringTrimLeft($aWhole[$i+1], 20))
EndIf
Else
FileWriteLine(@ScriptDir & "\auswertung_" & $user & ".txt", "Berechtigungen von " & $sUserShorten & ":" & @CRLF)
FileWriteLine(@ScriptDir & "\auswertung_" & $user & ".txt", StringTrimLeft($aWhole[$i+1], 20))
EndIf
EndIf
Next
; Löschen der temporären Dateien
FileDelete(@ScriptDir & "\temp_user.txt")
FileDelete(@ScriptDir & "\folder.ps1")
EndFunc ;==> _FolderShowFilter($user)
Alles anzeigen
Das Ende der Geschichte:
Er braucht natürlich ewig zum Abgleichen, ob eine explizite Berechtigung des Benutzers auf die Ordner des Fileservers vorhanden ist.
Kann ich irgendwie in dem Powershell Skript eintragen, dass er ausschließlich die expliziten Berechtigungen des Benutzers "xyz" als Datei speichern soll? Das würde das ganze Thema erheblich verkürzen und wäre eine deutlich "hübschere" Lösung.
Vielen Dank vorab und LG,
der Robert