我無法讓一個小的 PS 腳本按照我想要的方式作業。
Powershell 版本:5.1
最終目標:我想決議所有現有的本地用戶帳戶并生成一個不屬于任何本地組的串列。(這不是 AD 環境,也不是域的一部分。這只是本地作業系統帳戶和組。)另外,我只對手動創建的組感興趣 - 我不關心默認的系統組. (稍后將詳細介紹我如何嘗試實作這一點。)然后,在我讓這部分作業之后,這個輸出(用戶名串列)將被使用(將來 - 未在此代碼中顯示)作為另一個輸入將這些非組內用戶添加到組的塊。
我找到了一段代碼示例——它有效,并產生了正確的用戶名集。但它很慢 - 花了 > 5 分鐘。所以我想要更快的東西。
我現在使用的方法通常看起來會奏效,而且速度很快。我只是很難讓它正確地限制事情。似乎我無法參考 cmdlet 回傳的物件的屬性。(請參閱下面的代碼。這里也有各種計數器和寫入主機步驟,純粹是為了幫助我了解正在發生的事情和除錯 - 它們不是實際任務所必需的。)
我將如何處理此問題的總體概述:
編譯所有組中所有用戶的串列
- 但是,我只想要沒有描述的組——這些是我在機器上創建的。作業系統默認組都有描述。這將幫助我縮小我的用戶串列。
回圈遍歷系統上所有用戶的串列
- 將每個用戶與步驟 1 中的串列進行比較
- 如果用戶在串列中,那么該用戶在一個組中,所以跳過它
- 如果用戶不在串列中,則保存/報告該名稱 [旁注 - 用戶“WDAGUtilityAccount”結果也不在任何組中,但我不想更改那個;所以有一個特定的測驗將其從串列中排除。]
【原版代碼】
# --- Part 1
$UsersList = foreach ( $aGroup in get-localgroup ) {
$groupcount
# Only want Groups that don't have a Description
if ( $null -eq $aGroup.Description ) {
Get-LocalGroupMember $aGroup.name
}
write-host "$groupCount -- $aGroup.Name _ $aGroup.Description"
}
# Just for debugging - to see the content of Part 1
write-host "List = $UsersList"
# ---- Part 2
Get-LocalUser | ForEach-Object {
$count
$name = $_.Name
if ( $name -eq "WDAGUtilityAccount" ) {
# nothing - skip this one
} elseif ( $UsersList.Name -inotcontains "$env:COMPUTERNAME\$_" ) {
$count2
write-host "$Count ($Count2) : $name -- not a part of any groups"
}
}
看來我在第 1 部分中提取組屬性的嘗試失敗了 - 我得到的是文字文本“名稱”和“描述”,而不是 aGroup.Name aGroup.Description 屬性值。所以我的輸出看起來像“MyGroup1.Name”而不是“MyGroup1”(假設組的實際名稱是“MyGroup1”)。
我相信我正在正確地接近“組”物件 - 當我執行“get-localgroup | get-member”它說它是一個“LocalGroup”物件,具有各種屬性(名稱和描述是其中的兩個)。
可能有很多其他方法可以解決這個問題——我有興趣聽到一般的想法;但我也想知道我當前代碼的具體問題 - 這是一個學習練習。:)
謝謝,J
[ 代碼版本 2 - 經過一些建議......]
$UsersList = foreach ( $aGroup in get-localgroup ) {
$groupcount
#Write-Host $aGroup.Description
# Only want Groups that don't have a Description (i.e. are the Groups that we created, not the default System/OS groups)
if ( $null -eq $($aGroup.Description) ) {
$UserList = Get-LocalGroupMember $($aGroup.name)
write-host "$groupCount -- $($aGroup.Name) _ $($aGroup.Description)"
}
}
write-host "List = $UsersList"
Get-LocalUser | ForEach-Object {
$count
$name = $_.Name
if ( $name -eq "WDAGUtilityAccount" ) {
# nothing - skip this one
} elseif ( $($UsersList.name) -inotcontains "$env:COMPUTERNAME\$_" ) {
$count2
write-host "$Count ($Count2) : $name -- not a part of any groups"
}
}
uj5u.com熱心網友回復:
我相信這可以簡化為:
Description存盤組為 null的任何組的所有成員。- 獲取所有本地用戶并過濾其用戶名稱不等于
WDAGUtilityAccount且不屬于存盤成員SID陣列的部分。
$members = Get-LocalGroup | Where-Object { -not $_.Description } | Get-LocalGroupMember
Get-LocalUser | Where-Object {
$_.Name -ne 'WDAGUtilityAccount' -and $_.SID -notin $members.SID
} | Format-Table -AutoSize
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429774.html
下一篇:為什么沒有顯示產品?
