Если я вас правильно понимаю, вы хотите, чтобы новая запись имела все членства в старой записи.
По моему мнению, вы можете сосредоточиться только на членстве в коллекции, независимо от того, является ли развертывание в коллекции пакетом, приложением.или обновление не должно быть важным, если коллекции одинаковы.
Итак, сначала вам нужно будет перевести имя вашего устройства в идентификатор ресурса, так как это первичный ключ во всех таблицах sccm:
$WS = 'IN-00001236'
$resourceID = (Get-WmiObject -Class "SMS_R_System" -Filter "(Name = '$WS')" | Select-Object -last 1).ResourceID
как только вы получите все члены коллекции
$collectionMembers = (Get-WmiObject -Class "SMS_FullCollectionMembership" -Filter "(ResourceID = '$resourceID')" | where { $_.IsDirect -eq $true }).CollectionID
, чтобы удалить запись, используйте эту
[void](Get-WmiObject -Class "SMS_R_System" -Filter "(ResourceID = '$resourceID')").Delete()
, теперь вам нужно добавить их в новую запись (сначала снова получите resourceID)
Foreach($CollID in $collectionMembers) {
$CollectionQuery = Get-WmiObject -Class "SMS_Collection" -Filter "CollectionID = '$CollID'"
$directRule = (Get-WmiObject -List -Class "SMS_CollectionRuleDirect").CreateInstance()
$directRule.ResourceClassName = "SMS_R_System"
$directRule.ResourceID = $newResourceID
[void]$CollectionQuery.AddMemberShipRule($directRule)
}
Если вы хотите использовать это для нескольких устройств в цикле, вы можете просто создать CSV-файл с oldrecord,newrecord
import с
$records = Import-Csv <path to csv> -Header old,new
, а затемиспользовать цикл за пределами всего кода, например
foreach ($record in $records) {
# inside here use $record.old or $record.new for the old/new names like
# $WS = $record.old
}
Теперь я не знаю, понадобится ли вам файл Excel, если у вас просто есть скрипт, выполняющий работу, но в случае, если вы действительноy вы можете создать превосходный для чтения csv из powershell с помощью export-csv (могут потребоваться такие параметры, как -Delimiter ';' -NoTypeInformation -Кодирование UTF8 для удобства чтения)
Теоретически вы можете выполнить весь SQL-запроса также в powershell
$sqlText = "your query"
$SQLConnection = new-object System.Data.SqlClient.SQLConnection("Server=<sccmserver>;Database=<sccm db>;Integrated Security=SSPI")
$SQLConnection.Open();
$cmd = new-object System.Data.SqlClient.SqlCommand($sqlText, $SQLConnection);
$reader = $cmd.ExecuteReader()
while ($reader.Read()) {
$reader["<columnname>"]
}
и воссоздайте свой файл в сценарии ps