2017-07-14 76 views
0

如何標題?Powershell正則表達式匹配,並不匹配在一個Foreach如果 - 然後不工作

我有這個腳本我一直在處理,它有兩個基本的事情:a)使用get-ntfsaccess來拉取文件夾的安全性,然後b)使用輸出來查找有權訪問的組的組成員。

$Outfile2 = "C:\Users\local\Documents\GroupMembers.csv" 
$Header2 = "GroupName,Member" 

Add-Content -Value $Header2 -Path $Outfile2 

$RootPath = "p:\city\Department\building" 
$Folders = get-childitem2 -directory -recurse -path $RootPath 

foreach ($Folder in $Folders){ 
    $ACLs = Get-NTFSAccess $Folder.fullname 

    Foreach ($ACL in $ACLs){ 
    If ($Acl.accounttype -match 'group' -and $acl.Account.accountname -notmatch '^builtin|^NT AUTHORITY\\|^Creator|^AD\\Domain') 
    { 
    $members = Get-ADGroupMember $acl.Account.accountname.TrimStart("AD\\") 
    } 
    Foreach ($member in $members) { 

    $OutInfo = $ACL.Account.AccountName + "," + $member.samaccountname 
    Add-Content -Value $OutInfo -Path $OutFile2 
    } 
    }} 

我想要過濾get-ntfsaccess的輸出。我只想查找'組'和不屬於基本組的組(例如內建,域管理員等),但是我的匹配和不匹配不在腳本中工作。如果我採用完全相同的行並從提示符運行它 - 它的工作原理。

NotMatch is true

PS C:\Windows\system32> $acl.Account.accountname -notmatch '^builtin|^NT AUTHORITY\\|^Creator|^AD\\Domain' 
True 

當作爲腳本的一部分運行 - 不工作。我的輸出包括所有的域基本組和用戶。我喜歡也最終添加-unique只得到獨特的組,但這部分讓我難住....

在此先感謝...!

+0

'AD \ DOMAIN'是不是有效的域短名稱 –

+0

這就是廣告的域名(「AD」),這樣應該匹配「AD \ Domain Admins」之類的內容。即使如此,它不應該與其他人相匹配,還是他們都必須是真實的?我試圖編輯他們,但只有一個出來,它仍然不會匹配... – RichardX

回答

0

我這樣做成功:

((dir)[0] | get-acl).access | % { $_.IdentityReference } | ? { $_ -notmatch 'builtin|nt authority' } 

我不能在此刻與ntfsaccess測試,但得到的ACL的返回的IdentityReference是最有可能您正在嘗試分析在同一領域。你可能會試着刪除你的'^'。我還測試了"myDomain\\Domain Admins",並按預期工作。

0

所以我想通了。

三個主要的事情 - 1. Trimstart不接受「/」不管我怎麼想「逃離」它 2.只好用得到,廣告組來管得到,adgroupmember 3.如果當時是腳本阻止錯誤的寫在通過$ ACL的每一次迭代每個結果出來

$Outfile2 = "C:\Users\local\Documents\GroupMembers.csvv" 
$Header2 = "GroupName,Member" 

Add-Content -Value $Header2 -Path $Outfile2 

$RootPath = "p:\city\Department\building" 

$Folders = get-childitem2 -directory -recurse -path $RootPath 

foreach ($Folder in $Folders){ 
$ACLs = Get-NTFSAccess $Folder.fullname 

    Foreach ($ACL in $ACLs){ 
    If ($Acl.accounttype -match 'group' -and $acl.Account.accountname -notmatch '^builtin|^NT AUTHORITY\\|^Creator|^AD\\Domain') 
    {$members = Get-adgroup $acl.Account.accountname.substring(3) | Get-ADGroupMember 

    Foreach ($member in $members) { 
    $OutInfo = $ACL.account.AccountName + "," + $member.samaccountname 
    Add-Content -Value $OutInfo -Path $OutFile2 
}}}}