Windows Admin Center - Tag (VM oder Host) - Powershell
Hello
Ich möchte im WAC im Übersichtsfenster bei allen Servern einen Tag setzen (Host, VM (egal auf welchem Host) oder nix davon).
Ich habe auch noch keinen Ansatz, wie ich das am Besten lösen könnte, hat irgendwer eine Idee? So einfach wie möglich, außer händisch setzen 😊
Franz
Ich möchte im WAC im Übersichtsfenster bei allen Servern einen Tag setzen (Host, VM (egal auf welchem Host) oder nix davon).
Ich habe auch noch keinen Ansatz, wie ich das am Besten lösen könnte, hat irgendwer eine Idee? So einfach wie möglich, außer händisch setzen 😊
Franz
Please also mark the comments that contributed to the solution of the article
Content-Key: 23612461200
Url: https://administrator.de/contentid/23612461200
Printed on: July 27, 2024 at 11:07 o'clock
8 Comments
Latest comment
Moin @Franz-Josef-II
vielleicht findest d da einen Ansatz:
https://4sysops.com/archives/use-windows-admin-center-with-powershell/
Kreuzberger
vielleicht findest d da einen Ansatz:
https://4sysops.com/archives/use-windows-admin-center-with-powershell/
Kreuzberger
![Mitglied: 13676056485 Mitglied: 13676056485](/images/members/profile_divers_64x64.png)
Verbindungen Eportieren, CSV anpassen und wieder importieren.
Verwenden von PowerShell zum Importieren oder Exportieren deiner Verbindungen (mit Tags)
Gruß wrk
Verwenden von PowerShell zum Importieren oder Exportieren deiner Verbindungen (mit Tags)
Gruß wrk
![Mitglied: 13676056485 Mitglied: 13676056485](/images/members/profile_divers_64x64.png)
Zitat von @Franz-Josef-II:
@13676056485: Beim Ex- bzw Import muß man ja auch zuerst den Tag angeben, eine automatische Befüllung ist da (leider) nicht.
Nein musst du nicht. Du musst die Tags nur in der CSV ergänzen und wieder importieren, das kann auch direkt per Powershell erfolgen wenn du nicht von Hand in Excel oder Texteditor bearbeiten willst , z.B.@13676056485: Beim Ex- bzw Import muß man ja auch zuerst den Tag angeben, eine automatische Befüllung ist da (leider) nicht.
# csv pfad
$csvpath = ".\wac-connections.csv"
# wac url
$url = "https://wac.domain.tld"
# Modul importieren
Import-Module "$env:ProgramFiles\windows admin center\PowerShell\Modules\ConnectionTools"
# Connections exportieren
Export-Connection $url -fileName $csvpath
# csv laden
$csv = Import-CSV -LiteralPath $csvpath -Delimiter ","
# und bearbeiten (hier jeder Connection bestimmte Tags zuweisen, dass kannst du via Where-Object filtern wie du willst)
$csv | %{
$_.tags = 'server|vm|testing'
}
# CSV exportieren
$csv | Export-CSV -LiteralPath $csvpath -Delimiter "," -NoType -Encoding UTF8
# ... und wieder importieren
Import-Connection $url -fileName $csvpath -prune
![Mitglied: 13676056485 Mitglied: 13676056485](/images/members/profile_divers_64x64.png)
Du kannst es auch ohne den Umweg über die CSV machen wenn du willst, im oben eingebundenen PS Modul findest du alles was du brauchst, das Update läuft dann über simple get und put Web-API Requests des Admin-Centers
# admin center url
$url = 'https://wac.domain.tld'
Function Get-Params {
param(
[Parameter(Mandatory = $false)]
[Uri]
$GatewayEndpoint,
[Parameter(Mandatory = $false)]
[pscredential]
$Credential
)
if ( $GatewayEndpoint -eq $null ) {
try
{
$GatewayEndpoint = [Uri] ( Get-ItemPropertyValue 'HKCU:\Software\Microsoft\ServerManagementGateway' 'SmeDesktopEndpoint' )
}
catch
{
throw (New-Object System.Exception -ArgumentList 'No endpoint was specified so a local gateway was assumed and it must be run at least once.')
}
}
$params = @{useBasicParsing = $true; userAgent = "PowerShell"}
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$clientCertificateThumbprint = ''
$IsLocal = $GatewayEndpoint.IsLoopback -or ( $GatewayEndpoint.Host -eq $Env:ComputerName )
if ( ( $GatewayEndpoint.Scheme -eq [Uri]::UriSchemeHttps ) -and $IsLocal ) {
$clientCertificateThumbprint = (Get-ChildItem 'Cert:\CurrentUser\My' | Where-Object { $_.Subject -eq 'CN=Windows Admin Center Client' }).Thumbprint
}
if ($clientCertificateThumbprint) {
$params.certificateThumbprint = "$clientCertificateThumbprint"
}
else {
if ($Credential) {
$params.credential = $Credential
}
else {
$params.useDefaultCredentials = $True
}
}
$params.uri = "$($GatewayEndpoint)/api/connections"
return $params
}
# get connections
$params = Get-Params $url
$params.Method = 'Get'
$params.ContentType = 'application/json'
$connections = (Invoke-RestMethod @params).value.properties | select id,type,name,tags,groupId
# edit connections
$connections | %{
# assign unique id for upload
$_.id = $_.type + "!" + $_.name
if($groupId){
$_.Id = $id + "!" + $_.groupId
}
# assign tags
$_.tags = 'server','vm','testing'
}
# upload changes
$params.Method = 'Put'
$params.ContentType = 'application/json'
$params.Body = $connections | ConvertTo-JSON -Depth 100
Invoke-RestMethod @params
![Mitglied: 13676056485 Mitglied: 13676056485](/images/members/profile_divers_64x64.png)
Ich gehe hier von der Verwendung von DNSHostNamen (FQDNs) der Computer aus ...
So das war jetzt genug Silbertablett from my side ...
Good luck.
Haken dran bitte nicht vergessen.
🖖 WRK
# admin center url
$url = 'https://wac.domain.tld'
$computers = Get-ADComputer -Filter 'operatingsystem -like "*Windows server*" -and enabled -eq "true"' | select Name,DnsHostName,@{n='Model';e={(Get-CimInstance Win32_ComputerSystem -Computername $_.Name -Property Model -EA SilentlyContinue).Model}}
Function Get-Params {
param(
[Parameter(Mandatory = $false)]
[Uri]
$GatewayEndpoint,
[Parameter(Mandatory = $false)]
[pscredential]
$Credential
)
if ( $GatewayEndpoint -eq $null ) {
try
{
$GatewayEndpoint = [Uri] ( Get-ItemPropertyValue 'HKCU:\Software\Microsoft\ServerManagementGateway' 'SmeDesktopEndpoint' )
}
catch
{
throw (New-Object System.Exception -ArgumentList 'No endpoint was specified so a local gateway was assumed and it must be run at least once.')
}
}
$params = @{useBasicParsing = $true; userAgent = "PowerShell"}
$clientCertificateThumbprint = ''
$IsLocal = $GatewayEndpoint.IsLoopback -or ( $GatewayEndpoint.Host -eq $Env:ComputerName )
if ( ( $GatewayEndpoint.Scheme -eq [Uri]::UriSchemeHttps ) -and $IsLocal ) {
$clientCertificateThumbprint = (Get-ChildItem 'Cert:\CurrentUser\My' | Where-Object { $_.Subject -eq 'CN=Windows Admin Center Client' }).Thumbprint
}
if ($clientCertificateThumbprint) {
$params.certificateThumbprint = "$clientCertificateThumbprint"
}
else {
if ($Credential) {
$params.credential = $Credential
}
else {
$params.useDefaultCredentials = $True
}
}
$params.uri = "$($GatewayEndpoint)/api/connections"
return $params
}
# get connections
$params = Get-Params $url
$params.Method = 'Get'
$params.ContentType = 'application/json'
[array]$connections = (Invoke-RestMethod @params).value.properties | select id,type,name,tags,groupId
# add missing computers to connections
$computers | ? DNSHostName -NotIn $connections.name | %{
$connections += [pscustomobject]@{
id = ''
type = 'msft.sme.connection-type.server'
name = $_.DnsHostName
tags = $_.Model
groupId = ''
}
}
# edit connections
$connections | %{
# assign unique id for upload
$_.id = $_.type + "!" + $_.name
if($groupId){
$_.Id = $id + "!" + $_.groupId
}
# assign corresponding tags from the computer array
[string[]]$_.tags = $_.tags + ($computers | ? DnsHostname -eq $_.name | % Model) | select -Unique
}
# upload changes
$params.Method = 'Put'
$params.ContentType = 'application/json'
$params.Body = $connections | ConvertTo-JSON -Depth 100
Invoke-RestMethod @params
So das war jetzt genug Silbertablett from my side ...
Good luck.
Haken dran bitte nicht vergessen.
🖖 WRK