{"id":414,"date":"2023-12-13T07:59:48","date_gmt":"2023-12-13T06:59:48","guid":{"rendered":"https:\/\/sparrowte.ch\/?p=414"},"modified":"2026-04-08T11:21:35","modified_gmt":"2026-04-08T09:21:35","slug":"414","status":"publish","type":"post","link":"https:\/\/sparrow365.de\/index.php\/2023\/12\/13\/414\/","title":{"rendered":"Wie setze ich Entra ID Passw\u00f6rter mit PowerShell zur\u00fcck? (2023)"},"content":{"rendered":"<h2>Das Legacy Problem<\/h2>\n<p>Wenn man genau diese Frage stellt, findet man Online leider noch sehr viele L\u00f6sungen mit alten PowerShell Modulen (Azure AD, Azure AD Preview, MSOL), die <a href=\"https:\/\/techcommunity.microsoft.com\/t5\/microsoft-entra-blog\/important-azure-ad-graph-retirement-and-powershell-module\/ba-p\/3848270\"><strong>deprecated werden<\/strong><\/a><\/p>\n<p>Entsprechend hier eine kleine Sammlung der neuen Wege \u00fcber die PowerShell Graph SDK.<\/p>\n<blockquote>\n<p>! Notwendige Permissions finden sich am leichtesten via <code><code>Find-MgGraphCommand &quot;&lt;CmdLet&gt;&quot;<\/code><\/code>  <\/p>\n<\/blockquote>\n<p><br class=\"\"><\/p>\n<h2>EIGENES Kennwort \u00e4ndern, wenn man das alte kennt<\/h2>\n<p>Das ist so ziemlich das erste das man wahrscheinlich <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/user-changepassword?view=graph-rest-1.0&amp;tabs=powershell\">in der API Dokumentation findet<\/a>;<\/p>\n<p><strong>! Wichtig: Dieser Endpunkt kann nur bei dem aktuell gegen die Graph API Authentifizierten Benutzer genutzt werden !<\/strong><\/p>\n<pre><code class=\"language-powershell\"># Es kann der Benutzerprinzipalname (UPN) oder die Objekt-ID (OID) verwendet werden\n# Wichtig: Es muss der aktuell authentifizierte Benutzer sein\n$userId = (Get-MgContext).Account\n$params = @{\n    currentPassword = &quot;&lt;Aktuelles_Passwort&gt;&quot;\n    newPassword = &quot;&lt;Neues_Passwort&gt;&quot;\n}\nUpdate-MgUserPassword -UserId $userId -BodyParameter $params\n\n# Alternative ohne Microsoft.Graph.Users.Actions Modul:\nInvoke-MgGraphRequest POST &quot;\/v1.0\/me\/changePassword&quot; -Body $params<\/code><\/pre>\n<p>Die Einsatzzwecke sind limitiert, weil man sich vorab gegen die Graph API Authentifizieren muss, nur um dann noch mal das Kennwort anzugeben. Oder ich bin zu unkreativ. <\/p>\n<p>Viel interessanter ist wahrscheinlich:<\/p>\n<p><br class=\"\"><\/p>\n<h2>Als Admin das Kennwort eines Benutzers <em>Setzen<\/em><\/h2>\n<p>Diese M\u00f6glichkeit wird in der Dokumentation und im Diskurs leicht \u00fcbersehen. Man kann das Kennwort eines Benutzers setzen, <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/user-update?view=graph-rest-1.0&amp;tabs=http#example-3-update-the-passwordprofile-of-a-user-to-reset-their-password\">ohne dass er es beim n\u00e4chsten Login \u00e4ndern muss<\/a>.<\/p>\n<blockquote>\n<p>Wenn man nicht gerade bspw. automatisch das Kennwort eines Service Accounts rotiert oder einen anderen <strong>sehr guten Grund<\/strong> hat, sollte <code><code>forceChangePasswordNextSignIn = $true<\/code><\/code> genutzt werden<\/p>\n<p>M\u00f6chte man die \u00c4nderung \u00fcber die Enterprise Applikation umsetzen ist die Zuweisung einer Entra ID <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/user-update?view=graph-rest-1.0&amp;tabs=powershell#permissions\">Admin Rolle<\/a> notwendig<\/p>\n<\/blockquote>\n<p><img decoding=\"async\" src=\"https:\/\/sparrowte.ch\/wp-content\/uploads\/2023\/12\/preReqImage.png\" alt=\"Permission Prerequisites\" \/><\/p>\n<p><br class=\"\"><\/p>\n<pre><code class=\"language-powershell\"># Es kann der Benutzerprinzipalname (UPN) oder die Objekt-ID (OID) verwendet werden\n$userId = &quot;&lt;BenutzerId&gt;&quot;\n\n$params = @{\n  passwordProfile = @{\n    forceChangePasswordNextSignIn = $false\n    password = &quot;&lt;Neues_Passwort&gt;&quot;\n  }\n}\n\nUpdate-MgUser -UserId $userId -BodyParameter $params\n\n# Ohne Zus\u00e4tzliches Modul\nInvoke-MgGraphRequest PATCH &quot;\/v1.0\/users\/$userId&quot; -Body $params<\/code><\/pre>\n<p><br class=\"\"><\/p>\n<h2>Als Admin das Kennwort eines anderen Benutzers <em>\u00c4ndern<\/em><\/h2>\n<p>Mit einer entsprechenden <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/role-based-access-control\/privileged-roles-permissions?tabs=admin-center#who-can-reset-passwords\">Entra ID Admin Rolle<\/a> kann man \u00fcber die API <a href=\"https:\/\/learn.microsoft.com\/en-us\/graph\/api\/authenticationmethod-resetpassword?view=graph-rest-1.0&amp;tabs=http\">bei anderen Benutzern die Authentifizierungsmethode \u00e4ndern<\/a>.   <\/p>\n<p><strong>! Wichtig: \u00dcber diesen Endpunkt kann man nicht sein eigenes Kennwort zur\u00fccksetzen !<\/strong><\/p>\n<blockquote>\n<p><strong>Achtung<\/strong> &#8211; das zur\u00fccksetzen von Kennw\u00f6rtern \u00fcber diesen Endpunkt ist nur \u00fcber <strong>delegate Permissions<\/strong> m\u00f6glich &#8211; es kann nicht mit Application Permissions ein Kennwort zur\u00fcckgesetzt werden   <\/p>\n<p><strong>&quot;UserAuthenticationMethod.ReadWrite.All&quot;<\/strong> gibt schreibrechte f\u00fcr Microsoft Authenticator, FIDO Keys, &#8230; <strong>auch von privilegierten Benutzern!<\/strong><br \/>\nEin Angreifer mit einer solchen App Registration kann z.B. den Authenticator eines Global Admins entfernen<\/p>\n<\/blockquote>\n<pre><code class=\"language-powershell\"># Optional, gibt man den Parameter nicht an wird Entra ID als Antwort ein selbstgeneriertes Kennwort liefern\n# Das hier gesetzte Kennwort muss der Benutzer sofort \u00e4ndern\n$params = @{newPassword = &quot;&lt;Neues_Passwort&gt;&quot;}\n\n# Es kann der Benutzerprinzipalname (UPN) oder die Objekt-ID (OID) verwendet werden\n$userId = &quot;&lt;BenutzerId&gt;&quot;\n\n# Authentication Methode &quot;Passwort&quot; hat statisch diese ID\n$authMethodId = &quot;28c10230-6103-485e-b985-444c60001490&quot;\n\nReset-MgUserAuthenticationMethodPassword -UserId $userId -AuthenticationMethodId $authMethodId -BodyParameter $params\n\n# Ohne Microsoft.Graph.Users.Actions:\nInvoke-MgGraphRequest POST &quot;\/v1.0\/users\/$userId\/authentication\/methods\/$authMethodId\/resetPassword&quot; -Body $params<\/code><\/pre>\n<p><br class=\"\"><\/p>\n<p>Gibt man kein Initialpasswort an, sollte man die Antwort f\u00fcr weitere Verarbeitung abfangen: <\/p>\n<pre><code class=\"language-powershell\">$res = Reset-MgUserAuthenticationMethodPassword -UserId $userId -AuthenticationMethodId $authMethodId\n$res = Invoke-MgGraphRequest POST &quot;\/v1.0\/users\/$userId\/authentication\/methods\/$authMethodId\/resetPassword&quot; \n\n$res.NewPassword<\/code><\/pre>\n<p>Ergebnis:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/sparrowte.ch\/wp-content\/uploads\/2023\/12\/passwordResult.png\" alt=\"PasswordOutput\" \/><\/p>\n<p><br class=\"\"><\/p>\n<h2>Abschlie\u00dfende Worte<\/h2>\n<p>Hoffentlich konnte ich ein wenig Verwirrung aufl\u00f6sen oder bei der Abl\u00f6sung der alten Module helfen &#8211; ich habe mich mit dem Thema auseinander gesetzt weil ich ein Initialkennwort f\u00fcr eine PAM L\u00f6sung setzen wollte und eher ungl\u00fccklich mit den Artikeln war, die ich gefunden habe. Wenn es noch etwas bei diesem zu verbessern gibt, sag mir bitte bescheid.<\/p>\n<p><br class=\"\"><\/p>\n<p>Ich werde keine Kommentare moderieren und m\u00f6chte Ihre E-Mail-Adresse nicht; bitte beteiligen Sie sich an der Diskussion \u00fcber <a href=\"https:\/\/www.linkedin.com\/posts\/julian-sperling-4bba72228_wie-setze-ich-entra-id-passw%C3%B6rter-mit-powershell-activity-7141402383439364096-wjgO?utm_source=share&amp;utm_medium=member_desktop\">meinen Zugeh\u00f6rigen LinkedIn Post<\/a>.<\/p>\n<p><br class=\"\"><\/p>\n<p>Wenn sie an den Dingen interessiert sind die ich tue <a href=\"https:\/\/www.linkedin.com\/in\/julian-sperling-4bba72228\/\">folgen sie mir auf LinkedIn<\/a>.   <\/p>\n<p><br class=\"\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Legacy Problem Wenn man genau diese Frage stellt, findet man Online leider noch sehr viele L\u00f6sungen mit alten PowerShell Modulen (Azure AD, Azure AD Preview, MSOL), die deprecated werden Entsprechend hier eine kleine Sammlung der neuen Wege \u00fcber die PowerShell Graph SDK. ! Notwendige Permissions finden sich am leichtesten via Find-MgGraphCommand &quot;&lt;CmdLet&gt;&quot; EIGENES Kennwort&#8230; &raquo; <a class=\"read-more-link\" href=\"https:\/\/sparrow365.de\/index.php\/2023\/12\/13\/414\/\">weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":424,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,48],"tags":[72,111,113,70,115,109,64,52,60,56,58,117,107,54,62],"class_list":["post-414","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-me-id","category-powershell","tag-aad","tag-auth-methods","tag-authenticationmethods","tag-azure-ad","tag-change","tag-changepassword","tag-entra","tag-entra-id","tag-graph","tag-graph-api","tag-microsoft-graph","tag-password","tag-passwoerter","tag-powershell","tag-powershell-sdk"],"_links":{"self":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/414","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/comments?post=414"}],"version-history":[{"count":11,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/414\/revisions"}],"predecessor-version":[{"id":436,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/posts\/414\/revisions\/436"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media\/424"}],"wp:attachment":[{"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/media?parent=414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/categories?post=414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparrow365.de\/index.php\/wp-json\/wp\/v2\/tags?post=414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}