VBS - Найти идентификаторы, имена и имена пакетов SCCM, к которым относится компьютер? - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время у меня есть «запрос SQL Excel» для предметного требования, и он выполняется нормально без каких-либо проблем.

Текущий скрипт SQL-запроса Excel: Я создал SQL-запрос, который подключается к серверу SCCM и получает следующие данные.

Excel 2013 / 2016-> Данные -> Подключения-> Подключения к рабочей книге -> Запрос SQL Excel

Строка подключения:

Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=CM_CAS;Data Source=<SCCMServerIP>;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=<SCCMServerHostName>;Use Encryption for Data=False;Tag with column collation when possible=False

Тип команды: SQL

Текст команды:

DECLARE @machname varchar(max)

SET @machname = '<DeviceHostName>'

select CollectionID,CollectionName,packagename,@machname as MachineName from v_AdvertisementInfo 

-- select AssignmentID,AssignmentName,CollectionID,CollectionName,ApplicationName,AppModelID from v_ApplicationAssignment

where CollectionID in 

(select FCM.CollectionId from dbo.v_R_System r join 

dbo.v_FullCollectionMembership FCM on R.ResourceID = FCM.ResourceID join 

dbo.v_Collection C on C.CollectionID = FCM.CollectionID Where R.Name0 

= @machname) and 

ProgramName not like '%Remove%'and 
 ProgramName not like '%Un-Install%'and 
 CollectionName not like '%Test%' and
CollectionName not like '%temp%'


union

select CollectionID,CollectionName,ApplicationName,@machname as MachineName from v_ApplicationAssignment
where CollectionID in 

(select FCM.CollectionId from dbo.v_R_System r join 

dbo.v_FullCollectionMembership FCM on R.ResourceID = FCM.ResourceID join 

dbo.v_Collection C on C.CollectionID = FCM.CollectionID Where R.Name0 

= @machname) and

CollectionName not like '%Test%' and
CollectionName not like '%temp%'

+++++++++++++++++++++++++++++++++++++++++++++

Пример вывода в формате Excel будет таким, как показано ниже для

hostname 'IN-00001236'

Результат / выход

Требование: для обновления EOL для ноутбука

Соберите все идентификаторы коллекции, которые являются членами IN-00001236 (EOL Device), и добавьте имя хоста нового устройства (IN-1111) в идентификаторы коллекции результатов! затем удалите IN-00001236 из SCCM. Создать отчет в excel / CSV?

У меня есть проблема В вышеупомянутом Excel SQL Query? как у меня есть добавить / заменить имя хоста каждые time/run в 'Command Text'

Итак, мне нужно автоматизировать этот полный процесс с помощью VBS или PS?

Ответы [ 2 ]

0 голосов
/ 22 июня 2018

Наконец я закончил VBS, как показано ниже.работает нормально.

Dim connect, sql, resultSet, pth, txt

Set ObjFSO = CreateObject("Scripting.FileSystemObject")
Set connect = CreateObject("ADODB.Connection")
connect.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=CM_CAS;Data Source=<SCCMServerIP>;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=<SCCMServerHostName>;Use Encryption for Data=False;Tag with column collation when possible=False;Trusted_Connection=True;"
connect.Open

sql="select CollectionID,CollectionName,packagename,<HostName> as MachineName from v_AdvertisementInfo where CollectionID in (select FCM.CollectionId from dbo.v_R_System r join dbo.v_FullCollectionMembership FCM on R.ResourceID = FCM.ResourceID join dbo.v_Collection C on C.CollectionID = FCM.CollectionID Where R.Name0 = 'HostName') and ProgramName not like '%Remove%'and ProgramName not like '%Un-Install%'and CollectionName not like '%Test%' and CollectionName not like '%temp%' union select CollectionID,CollectionName,ApplicationName,@machname as MachineName from v_ApplicationAssignment where CollectionID in (select FCM.CollectionId from dbo.v_R_System r join dbo.v_FullCollectionMembership FCM on R.ResourceID = FCM.ResourceID join dbo.v_Collection C on C.CollectionID = FCM.CollectionID Where R.Name0 = 'HostName') and CollectionName not like '%Test%' and CollectionName not like '%temp%'"

Set resultSet = connect.Execute(sql)

pth = "C:\test\test.csv"

Set txt = ObjFSO.CreateTextFile(pth, True)

On Error Resume Next
resultSet.MoveFirst
Do While Not resultSet.eof
  txt.WriteLine(resultSet(0) & "," & resultSet(1) & "," & resultSet(2))
  resultSet.MoveNext
Loop

resultSet.Close
connect.Close
Set connect = Nothing
0 голосов
/ 16 мая 2018

Если я вас правильно понимаю, вы хотите, чтобы новая запись имела все членства в старой записи.

По моему мнению, вы можете сосредоточиться только на членстве в коллекции, независимо от того, является ли развертывание в коллекции пакетом, приложением.или обновление не должно быть важным, если коллекции одинаковы.

Итак, сначала вам нужно будет перевести имя вашего устройства в идентификатор ресурса, так как это первичный ключ во всех таблицах 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

...