通过Powershell为AzureAD设置StrongAuthenticationUserDetails PhoneNumber?

时间:2017-08-16 16:18:57

标签: powershell azure

这个头衔真的流了。

在设置用于Azure Active Directory的计算机时,我们会让IT进行初始设置和配置。这包括首次登录并加入Azure Active Directory。登录时强制您选择验证方法。我们可以使用我们的桌面电话或手机轻松。

现在是我们更新第二个因素电话号码的时候了。我知道通过Azure AD Web UI手动执行此操作的方法,但我正在寻找一种在PowerShell中设置该编号的脚本方式。

以下是我通过PowerShell检索号码的方法。

Get-msoluser -UserPrincipalName "email@emailaddress.com" | Select-Object -ExpandProperty StrongAuthenticationUserDetails

该代码返回此信息:

ExtensionData                     : System.Runtime.Serialization.ExtensionDataObject
AlternativePhoneNumber            :
Email                             :
OldPin                            :
PhoneNumber                       : +1 5554445555
Pin                               :

但是,似乎没有类似的选项来设置StrongAuthenticationUserDetails。

我的所有搜索都提到了如何批量启用双因素身份验证,这不是我想要做的。我想保留StrongAuthentication,只更新电话号码。

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,看来PowerShell有只读访问权限。

Azure feedback上甚至打开了门票。

有计划去做,但没有ETA。我的猜测是,如果你只想使用PowerShell,你将不得不等待。

作为解决方法,您可以使用 powershell & watir for .NET WatinWatin recorder通过Internet Explorer自动化它。因为我没有测试Azure;我无法为您创建可行的代码。

使用 Watin 和powershell - 您可以查看:https://cmille19.wordpress.com/2009/09/01/internet-explorer-automation-with-watin/

以下文字和代码,我想在这里备份,取自上面的页面(所有作者的作品):

  

接下来,单击“记录”按钮,然后单击所需的HTML元素   自动化。然后停止WatIN记录器并单击复制代码   剪贴板图标。这将生成一些只需要的C#代码   翻译成PowerShell:

// Windows
WatiN.Core.IE window = new WatiN.Core.IE();

// Frames
Frame frame_sd_scoreboard = window.Frame(Find.ByName("sd") && Find.ByName("scoreboard"));

// Model
Element __imgBtn0_button = frame_sd_scoreboard.Element(Find.ByName("imgBtn0_button"));

// Code
__imgBtn0_button.Click();
window.Dispose();
  

所以,我现在知道按钮的名称,它是3帧深。一个   稍微有点WatIN对象探索,我想出了以下内容   脚本,每50分钟点击一次按钮。

#Requires -version 2.0
#powershell.exe -STA

[Reflection.Assembly]::LoadFrom( "$ProfileDirLibrariesWatiN.Core.dll" ) | out-null
$ie = new-object WatiN.Core.IE("https://sd.acme.com/CAisd/pdmweb.exe")
$scoreboard  = $ie.frames | foreach {$_.frames } | where {$_.name –eq ‘sd’} |  foreach {$_.frames } | where {$_.name –eq ‘scoreboard’}
$button = $scoreboard.Element("imgBtn0_button")

while ($true)
{
    $button.Click()
    #Sleep for 50 minutes
    [System.Threading.Thread]::Sleep(3000000)
}

答案 1 :(得分:0)

免责声明:该代码按原样提供。万一MS更改了Azure Portal界面,它可能会停止工作。


我正在使用以下Greasemonkey脚本来更新备用电子邮件和电话(电话can be updated via Graph API now,因此该脚本仅对电子邮件有用):

// ==UserScript==
// @name     Unnamed Script 548177
// @version  1
// @grant    none
// @namespace https://portal.azure.com
// ==/UserScript==

(function(){
document.addEventListener('keydown', function(e) {
  // press alt+shift+g
  if (e.keyCode == 71 && e.shiftKey && !e.ctrlKey && e.altKey && !e.metaKey) {
    const url = document.URL;
    const regex = /https:\/\/portal.azure.com\/#blade\/Microsoft_AAD_IAM\/UserDetailsMenuBlade\/UserAuthMethods\/userId\/[\w-]+\/adminUnitObjectId[\/]*\?\w+=(\d{9})&\w+=([\w\.-@]+)/;
    const params = url.match(regex);
    const allAuthRows = document.getElementsByClassName('ext-userauthenticationmethods-section-row');
    const authRowsArray = Array.from(allAuthRows);
    let emailRow;
    let phoneRow;
    let i;
    for (i =0; i < authRowsArray.length; i++) {
      if (authRowsArray[i].childNodes[1].childNodes[1].childNodes[0].data === 'Email') {
        emailRow = authRowsArray[i]
      }
      if (authRowsArray[i].childNodes[1].childNodes[1].childNodes.length > 1) {
        if (authRowsArray[i].childNodes[1].childNodes[1].childNodes[1].childNodes[0].data === 'Phone') {
          phoneRow = authRowsArray[i]
        }
      }
    }

    const emailInput = emailRow.childNodes[3].childNodes[1].childNodes[1].childNodes[0].childNodes[0].childNodes[0].childNodes[2];
    const phoneInput = phoneRow.childNodes[3].childNodes[1].childNodes[1].childNodes[0].childNodes[0].childNodes[0].childNodes[2];
    const event = new Event('input', {
        'bubbles': true,
        'cancelable': true
    });
    if (params[1] !== '000000000') {
      phoneInput.value = `+48 ${params[1]}`;
      phoneInput.dispatchEvent(event);
    }
    if (params[2] !== 'null') {
      emailInput.value = params[2];
      emailInput.dispatchEvent(event);
    }
    setTimeout(() => {
      const buttonArr = document.getElementsByClassName('azc-toolbarButton-container fxs-portal-hover');
      const saveButton = Array.from(buttonArr).find(e => e.title === 'Save');
      saveButton.click();
    } , 2000);    

  }
}, false);
})();

它要求您使用这样的querystring打开Azure门户(我使用PowerShell来做到):

https://portal.azure.com/#blade/Microsoft_AAD_IAM/UserDetailsMenuBlade/UserAuthMethods/userId/$($u.ObjectId)/adminUnitObjectId/?param1=$newPhone&param2=$newMail

如何使用它:

  • 一次只能打开一个标签,否则您将收到Unable to sign-in错误
  • 您仍然会不时收到该错误,所以只需等待
  • 要触发脚本,请在加载网站后按Alt+Shift+g(您可以在第一个if中更改快捷方式)
  • 一旦更新并保存了数据,请按Ctrl+w关闭当前标签,然后按Alt+Tab切换到上一个窗口(应为PowerShell)
  • 您仍然可以使用代码来更新手机。确保更改国家代码(当前为+48代表波兰)