<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>LAPS - Local Administrator Password Solution</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/laps/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/laps/feed.xml</link>
    <description />
    <lastBuildDate>Mon, 10 Dec 2018 20:22:12 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Read "Remote Use of Local Accounts: LAPS Changes Everything"</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/read-remote-use-of-local-accounts-laps-changes-everything</link>
      <pubDate>Mon, 10 Dec 2018 20:22:12 GMT</pubDate>
      <dc:creator><![CDATA[Aaron Margosis]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/?p=355</guid>
      <description><![CDATA[Over on the Microsoft Security Guidance blog, we've posted a long overdue article about LAPS...]]></description>
      <content:encoded><![CDATA[Over on the <a target="_blank" href="https://blogs.technet.microsoft.com/secguide/" rel="noopener">Microsoft Security Guidance blog</a>, we've posted a long overdue article about LAPS enabling us to revisit the question about whether and when to block the use of local accounts, particularly for remote administration: https://blogs.technet.microsoft.com/secguide/2018/12/10/remote-use-of-local-accounts-laps-changes-everything/

&nbsp;

https://blogs.technet.microsoft.com/secguide/2018/12/10/remote-use-of-local-accounts-laps-changes-everything/]]></content:encoded>
    </item>
    <item>
      <title>LAPS Implementation Hints and Security Nerd Commentary (including mini threat model)</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-implementation-hints-and-security-nerd-commentary-including-mini-threat-model</link>
      <pubDate>Mon, 20 Feb 2017 18:43:23 GMT</pubDate>
      <dc:creator><![CDATA[Aaron Margosis]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/?p=335</guid>
      <description><![CDATA[Security supergurustar Jessica Payne (@jepayneMSFT) wrote a fantastic blog post about LAPS a while...]]></description>
      <content:encoded><![CDATA[Security supergurustar Jessica Payne (@jepayneMSFT) wrote a fantastic blog post about LAPS a while back. We should have linked to it from here a long time ago; we are correcting that oversight now. It authoritatively answers many frequently-asked-questions about LAPS. Check it out:

<a target="_blank" href="https://blogs.technet.microsoft.com/askpfeplat/2015/12/28/local-administrator-password-solution-laps-implementation-hints-and-security-nerd-commentary-including-mini-threat-model/">Local Administrator Password Solution (LAPS) Implementation Hints and Security Nerd Commentary (including mini threat model)</a>]]></content:encoded>
    </item>
    <item>
      <title>LAPS updated to 6.2.0</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-updated-to-6-2-0</link>
      <pubDate>Thu, 29 Sep 2016 20:55:03 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/?p=316</guid>
      <description><![CDATA[Hello,

Tonight, we released updated version of LAPS. Changes in new version:

 	Support for...]]></description>
      <content:encoded><![CDATA[Hello,

Tonight, we released updated version of LAPS. Changes in new version:
<ul>
 	<li>Support for localized local Administrators group name on localized OS builds when using setup parameter CUSTOMADMINNAME - you no longer need to create MST files for OS builds where name of Administrators group is localized to be able to create custom admin account during installation</li>
 	<li>Fix of bug “Format of path is invalid” in LAPS UI and PowerShell on Win 10 Anniversary update and Win 2016 Server, when reading and resetting the password</li>
 	<li>Fixed bug when some long error messages not shown in status bar of LAPS UI client</li>
 	<li>Font for password field in LAPS UI changed to Courier 12 for better readability of passwords</li>
</ul>
Download location did not change, so visit <a href="https://www.microsoft.com/en-us/download/details.aspx?id=46899">Download center</a> for download

Jiri]]></content:encoded>
    </item>
    <item>
      <title>LAPS and AD sizing considerations</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-and-ad-sizing-considerations</link>
      <pubDate>Mon, 08 Aug 2016 11:06:36 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/?p=305</guid>
      <description><![CDATA[Recently, I got asked few times by people planning LAPS deployment about LAPS impact to their AD...]]></description>
      <content:encoded><![CDATA[Recently, I got asked few times by people planning LAPS deployment about LAPS impact to their AD infrastructure - NTDS.dit size, replication, network bandwidth during GPO update. I always answered that LAPS impact will never be noticed because it's pretty small - and it's actually true. However, I thought it would be good to document here how small the LAPS deplyoment impact really is. So if you're interested, read further.

LAPS deployment impacts AD in the following major areas:
<ul>
 	<li><strong>AD DB size</strong>: It stores data in AD database, so people expect AD database grow</li>
 	<li><strong>Client - DC traffic</strong> during GPO update</li>
 	<li><strong>AD Replication traffic</strong>: LAPS client updates data in AD DB, and updates need to be replicated</li>
</ul>
<h1>AD DB size</h1>
LAPS stores 2 pieces of information in AD:
<ul>
 	<li><strong>Password</strong>: Stored as string, 1 byte per character (syntax of respective attribute is IA5 string)</li>
 	<li><strong>Password expiration time</strong>: 64-bit number, stored as string (currently 18 chars), 1 byte per number</li>
</ul>
So LAPS deployment with default password parameters - password 12 chars long expiring once a month - is expected to store 30 bytes of data with computer account.

To validate this expectation, I took ma test AD instance and created 25K of computer accounts (via New-ADComputer cmdlet), and then populated LAPS attributes with real data - password generated with <a href="https://gallery.technet.microsoft.com/Cryptographically-random-07eed923">LAPS password generator</a> and password expiration time in proper format. If the expectation is correct, then total increase of DB size shall be 25000 x 30 bytes = 750KB.

Size of AD DB size below:
<ul>
 	<li>Before creating 25K computer accounts: <strong>32 MB</strong></li>
 	<li>After creating 25K computer accounts: <strong>262 MB</strong></li>
 	<li>After populating password and expiration time: <strong>262 MB</strong></li>
</ul>
So no increase of AD DB size at all - AD allocates AD space in chunks, and was able to host data in whitespace allocated. Also, notice AD DB increase caused by creation of "empty" computer accounts: single computer account consumes almost 10KB of space.

As an additional test, I updated password to be 36 chars long on all 25K computer accounts. As a result, LAPS data now occuppied 54 bytes per computer account (18 bytes expiration timestamp + 36 bytes password). Resulting size of AD database after update: <strong>262 MB</strong> - so no increase of DB size at all again!

So we may say that most environment will not see any impact on AD DB size at all - even in environment with 1M of LAPS-managed machines, expected impact on AD size would be less than 50MB - really small fraction of their current AD DB size.
<h1>Client - DC traffic</h1>
Client - DC traffic during GPO update consists of 2 basic components:
<ul>
 	<li>Download of registry.pol file from SYSVOL: .pol file contains LAPS-specific GPO settings</li>
 	<li>LDAP traffic caused by LAPS client: LAPS client always reads password expiration time from AD, and - if password expired - uploads new password and expiration time</li>
</ul>
<h2>Registry.pol file</h2>
If you created dedicated GPO for LAPS settings, you can see the size of registry.pol yourself. If should be something <strong>between 148 bytes</strong> (minimal size that contains only necessary setting) a<strong>nd 942 bytes</strong> (all policies specified; size of custom admin name 20 chars). When LAPS settings are configured in existing GPO, size of registry.pol file increases accordingly - up to 1KB based on amount of settings configured

GPO client downloads the file within existing SMB session, so not much overhead here. Also, when you created new GPO, there's few things that GPO clients does (reads gpt.ini for new GPO, checks GPO version, etc.) - but those things are not LAPS specific.

Overall, let's say that <strong>impact in this area is up to 1 KB</strong> of network traffic.
<h2>LDAP traffic</h2>
LAPS client creates own LDAP session with DC, and uses encryption and signing to protect data transferred. Note for those having RODC in their environment: LAPS client ALWAYS talks to writable DC, always ignoring RODC (details may be worth of dedicated article in the future)

During initial rollout, LAPS clients try to retrieve password expiration time, receive error that value is not there, and uploads new password and expiration timestamp

During normal operation, LAPS client just retrieves password expiration time from AD, sees that password did not expire and stops processing.

When password expires (or is reset by LAPS operator), LAPS client downloads password expiration time, and uploads new password and expiration time.

Below see the impact on network traffic for scenarios above (captured by Netmon and analyzed by <a href="https://code.msdn.microsoft.com/How-to-parse-Network-f6162019">PSCap</a> tool):
<ul>
 	<li>Initial rollout:
<ul>
 	<li>Client -&gt; DC: 10 frames, <strong>2782 bytes</strong></li>
 	<li>DC -&gt; Client: 7 frames, <strong>847 bytes</strong></li>
</ul>
</li>
 	<li>Normal operation, no password change:
<ul>
 	<li>Client -&gt; DC: 6 frames, <strong>2308 bytes</strong></li>
 	<li>DC -&gt; Client: 6 frames, <strong>767 bytes</strong></li>
</ul>
</li>
 	<li>Normal operation, password change &amp; upload:
<ul>
 	<li>Client -&gt; DC: 8 frames, <strong>2674 bytes</strong></li>
 	<li>DC -&gt; Client: 7 frames, <strong>908 bytes</strong></li>
</ul>
</li>
</ul>
So overall, impact on network bandwidth caused by LDAP operations per LAPS client is up to <strong>3KB of download and up to 1KB of upload.</strong> You can estimate impact to your environment just by multiplying these numbers by # of machines serviced by single DC.
<h1>Replication traffic</h1>
As shown above, 1 LAPS client typically stores less than 50 bytes in AD database. This data typically changes 1 x month, and needs to be replicated to other DCs in domain. By default, LAPS data is not replicated to GC.

Let's take the example we used for AD DB sizing impact estimation above - <strong>25K LAPS managed machines</strong> - let's assume that all those machines are supported by 1 DC (in real environment, the number will likely be lower).

For i<strong>ntrasite replication</strong>, this means to replicate <strong>~750KB of data, uncompressed</strong>, which is really nothing you should be worried about. Remember, data is changed during GPO update, and GPO framework itself adds some random delay, so as all machines do not contact DC at the same time, and the change will not happen at the same time, and data is likely to be replicated during different replication cycles.

For i<strong>ntersite replication</strong>, worst case is that you have scheduled replication quite infrequently, and all machines supported by single DC will change the password between 2 replication cycles of that DC. this means that DC needs to replicate ~750KB of data, compressed. For LAPS data, you can expect compression ratio ~50%, so amount of data that needs to be replicated cross-site is likely <strong>less than 400KB</strong>. Again, this is nothing to be worried about, and, most likely, in your environment, the amount of data for single replication cycle is expected to be much less.

<em>Note</em>: I tested compression ratio by putting passwords and password expiration timestamps to ascii encoded text file, and compressing via makecab utility to create a compressed archive (uses mszip compressing, the same as legacy AD replication). Size of archive was slightly less than 50% of original file size

For replication with RODC, the amount of data will be even less: password is not replicated to RODC in standard LAPS setup, so only information that is replicated to RODC, is password expiration timestamp (18 bytes per computer account)
<h1>Summary</h1>
Impact of LAPS deployment to AD infrastructure is really small, and in most environments, AD admins will not even see it.

Jiri]]></content:encoded>
    </item>
    <item>
      <title>Testing LAPS for Nano Server with ws2016lab</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/jiri-formacek</link>
      <pubDate>Fri, 10 Jun 2016 12:42:30 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/?p=155</guid>
      <description><![CDATA[Recently I met Jaromir Kaspar, my fellow PFE, and we chatted on LAPS for Nano Server Preview I...]]></description>
      <content:encoded><![CDATA[Recently I met Jaromir Kaspar, my fellow PFE, and we chatted on LAPS for Nano Server Preview I recently published. He wanted to see it in action in lab of some size. He publishes Windows Server 2016 lab hydration scripts on <a href="https://github.com/Microsoft/ws2016lab">github</a>, so we came with idea to enhance those scripts by support for provisioning of DSC infrastructure that will automate LAPS for Nano Server installation and configuration. He started working at full throttle (as always) and shortly came to me to show working lab, updated hydration script and this blog post that describes the process he went through when building the lab. Enjoy reading and playing with LAPS on Nano server!

<hr />

Hi all, here is Jaromir – Premier Field Engineer, colleague of Jiri Formacek (creator of LAPS) and I would like to show you today, how easy is to deploy your Nano LAPS lab.

I met Jiri (he is real programmer, not me – I’m gluing scripts together not programming) in the office again and we talked little bit about LAPS. I asked if he tried my scripts (obvious answer is no, because he is super busy) so I decided to show him and you, how to create your own lab with my ws2016lab <a href="https://github.com/Microsoft/ws2016lab">https://github.com/Microsoft/ws2016lab</a> and LAPS for Nano server <a href="https://blogs.msdn.microsoft.com/laps/2016/05/10/laps-and-nano-server/">https://blogs.msdn.microsoft.com/laps/2016/05/10/laps-and-nano-server/</a> under 20 minutes.

You will go through end to end process from nothing to fully provisioned lab of Nano servers with LAPS for Nano installed and configured. What you will learn? How DSC Pull server works, how to deploy configuration on DSC Pull server, how to configure DSC client to pull the configuration, and how to install and configure LAPS for Nano via DSC.
<h1>Changes in ws2016lab scripts</h1>
<h2>Variables.ps1</h2>
<span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#LAPS Lab</span>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$LabConfig</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">@{AdminPassword<span style="color: darkgray">=</span><span style="color: darkred">'LS1setup!'</span>; DomainAdminName<span style="color: darkgray">=</span><span style="color: darkred">'JiriF'</span>; Prefix <span style="color: darkgray">=</span> <span style="color: darkred">'NanoLAPS-'</span>; SecureBoot<span style="color: darkgray">=</span><span style="color: darkred">'On'</span>; CreateClientParent<span style="color: darkgray">=</span><span style="color: darkred">'No'</span>; DCEdition<span style="color: darkgray">=</span><span style="color: darkred">'ServerDataCenter'</span>; ClientEdition<span style="color: darkgray">=</span><span style="color: darkred">'Enterprise'</span>; InstallSCVMM<span style="color: darkgray">=</span><span style="color: darkred">'No'</span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$NetworkConfig</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">@{SwitchName <span style="color: darkgray">=</span> <span style="color: darkred">'LabSwitch'</span>; StorageNet1<span style="color: darkgray">=</span><span style="color: darkred">'172.16.1.'</span>; StorageNet2<span style="color: darkgray">=</span><span style="color: darkred">'172.16.2.'</span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$LAbVMs </span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: darkgray">=</span> @()</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple">1</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">..</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple">2</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: darkgray">|</span> <span style="color: blue">%</span> {<span style="color: darkred">"Nano</span><span style="color: orangered">$_</span><span style="color: darkred">"</span>} <span style="color: darkgray">|</span> <span style="color: blue">%</span> { <span style="color: orangered">$LAbVMs</span> <span style="color: darkgray">+=</span> @{ VMName <span style="color: darkgray">=</span> <span style="color: orangered">$_</span> ; Configuration <span style="color: darkgray">=</span> <span style="color: darkred">'Simple'</span>; ParentVHD <span style="color: darkgray">= </span><span style="color: darkred">'Win2016Nano_G2.vhdx'</span>; MemoryStartupBytes<span style="color: darkgray">=</span> <span style="color: purple">128MB</span> ; <span style="background: yellow">DSCMode<span style="color: darkgray">=</span><span style="color: darkred">'Pull'</span></span>; <span style="background: yellow">DSCConfig<span style="color: darkgray">=</span>@(<span style="color: darkred">'LAPS_Nano_Install'</span><span style="color: darkgray">,</span><span style="color: darkred">'LAPSConfig1'</span>)</span>} }</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple">3</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">..</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple">4</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: darkgray">|</span> <span style="color: blue">%</span> {<span style="color: darkred">"Nano</span><span style="color: orangered">$_</span><span style="color: darkred">"</span>} <span style="color: darkgray">|</span> <span style="color: blue">%</span> { <span style="color: orangered">$LAbVMs</span> <span style="color: darkgray">+=</span> @{ VMName <span style="color: darkgray">= </span><span style="color: orangered">$_</span> ; Configuration <span style="color: darkgray">=</span> <span style="color: darkred">'Simple'</span>; ParentVHD <span style="color: darkgray">= </span><span style="color: darkred">'Win2016Nano_G2.vhdx'</span>; MemoryStartupBytes<span style="color: darkgray">=</span> <span style="color: purple">128MB</span> ; <span style="background: yellow">DSCMode<span style="color: darkgray">=</span><span style="color: darkred">'Pull'</span></span>; <span style="background: yellow">DSCConfig<span style="color: darkgray">=</span>@(<span style="color: darkred">'LAPS_Nano_Install'</span><span style="color: darkgray">,</span><span style="color: darkred">'LAPSConfig2'</span>)</span>} }</span></p>
 <span lang="EN-US"><span style="color: #000000;font-family: Calibri">In the example above, you can see that I will create 4 nano servers with specified DSCMode and Config. We will have 2 different configurations of LAPS for Nano.</span></span>

<span lang="EN-US"><span style="color: #000000;font-family: Calibri">BTW this is the only piece you need to modify in scripts that you can download from here: </span><a href="https://github.com/Microsoft/ws2016lab"><span style="color: #0563c1;font-family: Calibri">https://github.com/Microsoft/ws2016lab</span></a><span style="color: #000000;font-family: Calibri">. Notice that you are specifying DSCMode and DSCConfig. DSCMode specifies Pull Configuration, therefore Pull Server will be used (</span><a href="https://msdn.microsoft.com/en-us/powershell/dsc/pullServer"><span style="color: #0563c1;font-family: Calibri">https://msdn.microsoft.com/en-us/powershell/dsc/pullServer</span></a><span style="color: #000000;font-family: Calibri">) and DSCConfig specifies configuration that should be downloaded from Pull server (</span><a href="https://msdn.microsoft.com/en-us/powershell/dsc/partialconfigs"><span style="color: #0563c1;font-family: Calibri">https://msdn.microsoft.com/en-us/powershell/dsc/partialconfigs)</span></a> </span>

<span lang="EN-US"><span style="color: #000000;font-family: Calibri">If you want to have bigger lab, you can replace just few characters and hydrate 20 machines instead of 4:</span></span>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#LAPS Lab</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$LabConfig</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">@{AdminPassword<span style="color: darkgray">=</span><span style="color: darkred">'LS1setup!'</span>; DomainAdminName<span style="color: darkgray">=</span><span style="color: darkred">'JiriF'</span>; Prefix <span style="color: darkgray">=</span> <span style="color: darkred">'NanoLAPS-'</span>; SecureBoot<span style="color: darkgray">=</span><span style="color: darkred">'On'</span>; CreateClientParent<span style="color: darkgray">=</span><span style="color: darkred">'No'</span>; DCEdition<span style="color: darkgray">=</span><span style="color: darkred">'ServerDataCenter'</span>; ClientEdition<span style="color: darkgray">=</span><span style="color: darkred">'Enterprise'</span>; InstallSCVMM<span style="color: darkgray">=</span><span style="color: darkred">'No'</span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$NetworkConfig</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">@{SwitchName <span style="color: darkgray">=</span> <span style="color: darkred">'LabSwitch'</span>; StorageNet1<span style="color: darkgray">=</span><span style="color: darkred">'172.16.1.'</span>; StorageNet2<span style="color: darkgray">=</span><span style="color: darkred">'172.16.2.'</span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$LAbVMs</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: darkgray">=</span> @()</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple;background: yellow">1</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray;background: yellow">..</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple;background: yellow">10 </span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: darkgray">| </span><span style="color: blue">%</span> {<span style="color: darkred">"Nano</span><span style="color: orangered">$_</span><span style="color: darkred">"</span>} <span style="color: darkgray">|</span> <span style="color: blue">%</span> { <span style="color: orangered">$LAbVMs</span> <span style="color: darkgray">+= </span>@{ VMName <span style="color: darkgray">=</span> <span style="color: orangered">$_ </span>; Configuration <span style="color: darkgray">=</span> <span style="color: darkred">'Simple'</span>; ParentVHD <span style="color: darkgray">= </span><span style="color: darkred">'Win2016Nano_G2.vhdx'</span>; MemoryStartupBytes<span style="color: darkgray">=</span> <span style="color: purple">128MB</span>; DSCMode<span style="color: darkgray">=</span><span style="color: darkred">'Pull'</span>; DSCConfig<span style="color: darkgray">=</span>@(<span style="color: darkred">'LAPS_Nano_Install'</span><span style="color: darkgray">,</span><span style="color: darkred">'LAPSConfig1'</span>)}}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="background: yellow;color: purple;font-family: 'Lucida Console';font-size: 9pt">11</span><span style="background: yellow;color: darkgray;font-family: 'Lucida Console';font-size: 9pt">..2</span><span style="background: yellow;color: purple;font-family: 'Lucida Console';font-size: 9pt">0 </span><span style="font-family: 'Lucida Console';font-size: 9pt"><span style="color: darkgray">| </span><span style="color: blue">%</span> {<span style="color: darkred">"Nano</span><span style="color: orangered">$_</span><span style="color: darkred">"</span>} <span style="color: darkgray">|</span> <span style="color: blue">%</span> { <span style="color: orangered">$LAbVMs</span> <span style="color: darkgray">+= </span>@{ VMName <span style="color: darkgray">=</span> <span style="color: orangered">$_ </span>; Configuration <span style="color: darkgray">=</span> <span style="color: darkred">'Simple'</span>; ParentVHD <span style="color: darkgray">= </span><span style="color: darkred">'Win2016Nano_G2.vhdx'</span>; MemoryStartupBytes<span style="color: darkgray">=</span> <span style="color: purple">128MB</span>; DSCMode<span style="color: darkgray">=</span><span style="color: darkred">'Pull'</span>; DSCConfig<span style="color: darkgray">=</span>@(<span style="color: darkred">'LAPS_Nano_Install'</span><span style="color: darkgray">,</span><span style="color: darkred">'LAPSConfig2'</span>)}}</span></p>

<h2><span lang="EN-US" style="color: #000000"><span style="font-family: 'Calibri Light';font-size: x-large">2_CreateParentDisks.ps1 </span></span></h2>
During 2_CreateParentDisks.ps1, scripts will hydrate DC with following DSC Configuration (this is just a part of the script):

<span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">WindowsFeature</span>
<span style="color: blueviolet">DSCServiceFeature</span></span>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Ensure</span> <span style="color: blueviolet">=</span> <span style="color: darkred">"Present"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Name</span> <span style="color: blueviolet">=</span> <span style="color: darkred">"DSC-Service"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">xDscWebService</span> <span style="color: blueviolet">PSDSCPullServer</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Ensure </span><span style="color: blueviolet">= </span><span style="color: darkred">"Present"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  EndpointName</span><span style="color: blueviolet">= </span><span style="color: darkred">"PSDSCPullServer"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Port </span><span style="color: blueviolet">= </span><span style="color: purple">8080</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  PhysicalPath </span><span style="color: blueviolet">= </span><span style="color: darkred">"</span><span style="color: orangered">$env:SystemDrive</span><span style="color: darkred">\inetpub\wwwroot\PSDSCPullServer"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  CertificateThumbPrint</span><span style="color: blueviolet">=</span> <span style="color: darkred">"AllowUnencryptedTraffic"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  ModulePath </span><span style="color: blueviolet">= </span><span style="color: darkred">"</span><span style="color: orangered">$env:PROGRAMFILES</span><span style="color: darkred">\WindowsPowerShell\DscService\Modules"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  ConfigurationPath</span><span style="color: blueviolet">=</span> <span style="color: darkred">"</span><span style="color: orangered">$env:PROGRAMFILES</span><span style="color: darkred">\WindowsPowerShell\DscService\Configuration"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  State </span><span style="color: blueviolet">= </span><span style="color: darkred">"Started"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  DependsOn </span><span style="color: blueviolet">= </span><span style="color: darkred">"[WindowsFeature]DSCServiceFeature"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">xDscWebService</span> <span style="color: blueviolet">PSDSCComplianceServer</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Ensure </span><span style="color: blueviolet">= </span><span style="color: darkred">"Present"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  EndpointName </span><span style="color: blueviolet">= </span><span style="color: darkred">"PSDSCComplianceServer"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Port </span><span style="color: blueviolet">= </span><span style="color: purple">9080</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  PhysicalPath </span><span style="color: blueviolet">= </span><span style="color: darkred">"</span><span style="color: orangered">$env:SystemDrive</span><span style="color: darkred">\inetpub\wwwroot\PSDSCComplianceServer"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  CertificateThumbPrint </span><span style="color: blueviolet">=</span> <span style="color: darkred">"AllowUnencryptedTraffic"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  State </span><span style="color: blueviolet">= </span><span style="color: darkred">"Started"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  DependsOn </span><span style="color: blueviolet">= </span>(<span style="color: darkred">"[WindowsFeature]DSCServiceFeature"</span><span style="color: darkgray">,</span><span style="color: darkred">"[xDSCWebService]PSDSCPullServer"</span>)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">File</span> <span style="color: blueviolet">RegistrationKeyFile</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Ensure</span> <span style="color: blueviolet">=</span> <span style="color: darkred">'Present'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Type</span> <span style="color: blueviolet">=</span> <span style="color: darkred">'File'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  DestinationPath</span> <span style="color: blueviolet">= </span><span style="color: darkred">"</span><span style="color: orangered">$env:ProgramFiles</span><span style="color: darkred">\WindowsPowerShell\DscService\RegistrationKeys.txt"</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">  Contents </span><span style="color: blueviolet">=</span> <span style="color: orangered">$RegistrationKey</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">}</span></p>

<h2><span lang="EN-US" style="color: #000000"><span style="font-family: 'Calibri Light';font-size: x-large">3_Deploy.ps1</span></span></h2>
<span lang="EN-US"><span style="color: #000000;font-family: Calibri">During 3_Deploy.ps1 (based on variables.ps1) RegistrationKey that was used in DSC config above and Config name you specify will be set for each VM that will be created as you can see in DSC config below:</span></span>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#DCM Config</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">[</span><span style="font-size: 9.0pt;font-family: 'Lucida Console';color: deepskyblue">DSCLocalConfigurationManager</span><span style="font-size: 9.0pt;font-family: 'Lucida Console'">()<span style="color: darkgray">]</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkblue">Configuration</span><span style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: blueviolet">PullClientConfig</span>
</span><span style="font-size: 9.0pt;font-family: 'Lucida Console'">{</span><span style="font-size: 9.0pt;font-family: 'Lucida Console'">
<span style="color: darkblue"><span style="color: #333333">  </span>param</span></span><span style="font-size: 9.0pt;font-family: 'Lucida Console'">
(</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    <span style="color: darkgray">[</span><span style="color: deepskyblue">Parameter</span>(Mandatory<span style="color: darkgray">=</span><span style="color: orangered">$true</span>)<span style="color: darkgray">]</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    <span style="color: darkgray">[</span><span style="color: teal">string</span><span style="color: darkgray">[]]</span><span style="color: orangered">$ComputerName</span><span style="color: darkgray">,</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">   </span><span style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: darkgray">[</span><span style="color: deepskyblue">Parameter</span>(Mandatory<span style="color: darkgray">=</span><span style="color: orangered">$true</span>)<span style="color: darkgray">]</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    <span style="color: darkgray">[</span><span style="color: teal">string</span><span style="color: darkgray">[]]</span><span style="color: orangered">$DSCConfig</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">  )           </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: darkblue"><span style="color: #333333">  </span>Node</span> <span style="color: orangered">$ComputerName</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">  {</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: darkblue">    Settings</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    {</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      AllowModuleOverwrite <span style="color: darkgray">=</span> <span style="color: orangered">$True</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      ConfigurationMode <span style="color: darkgray">=</span> <span style="color: darkred">'ApplyAndAutoCorrect'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      RefreshMode <span style="color: darkgray">=</span> <span style="color: darkred">'Pull'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      RebootNodeIfNeeded <span style="color: darkgray">=</span> <span style="color: orangered">$True</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      ActionAfterReboot  <span style="color: darkgray">=</span> <span style="color: darkred">'ContinueConfiguration'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    }</span><span style="font-size: 9.0pt;font-family: 'Lucida Console'">
<span style="color: darkblue">ConfigurationRepositoryWeb</span> <span style="color: blueviolet">PullServerWeb</span> </span><span style="font-size: 9.0pt;font-family: 'Lucida Console'">
{ </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      ServerURL <span style="color: darkgray">=</span> <span style="color: darkred">'https://dc.corp.contoso.com:8080/PSDSCPullServer.svc'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      AllowUnsecureConnection <span style="color: darkgray">=</span> <span style="color: orangered">$true</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      RegistrationKey <span style="color: darkgray">= </span><span style="color: darkred">'14fc8e72-5036-4e79-9f89-5382160053aa'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      ConfigurationNames <span style="color: darkgray">= </span><span style="color: orangered">$DSCConfig</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    }</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    <span style="color: orangered">$DSCConfig</span><span style="color: darkgray">|</span> <span style="color: blue">ForEach-Object </span>{</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: darkblue">      PartialConfiguration</span> <span style="color: orangered">$_</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      {</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">        RefreshMode <span style="color: darkgray">=</span> <span style="color: darkred">'Pull'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">        ConfigurationSource <span style="color: darkgray">=</span> <span style="color: darkred">'[ConfigurationRepositoryWeb]PullServerWeb'</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">      }</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">    }</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">  }</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">}</span></p>
Result: 20 machines in 9.6 minutes. Its good, isn’t it? If you would like it in just few minutes – start bugging JiriF as he promised me to make it parallel (run several jobs at once) – he is a programmer, I’m just gluing scripts together, remember?

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image001.png"><img class="  wp-image-156 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image001.png" alt="image001" width="804" height="414" /></a>
<h1>LAPS Client for Nano Server</h1>
<strong>1) Grab LAPS.Nano.DSC module</strong> on Internet connected machine from PowerShell Gallery:
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><img class=" size-full wp-image-175 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image003.png" alt="image003" width="584" height="148" /></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">
<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image004.png"><img class=" size-full wp-image-165 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image004.png" alt="image004" width="613" height="194" /></a></span></p>
<strong>2) Create mof files</strong>

Downloaded module contains sample DSC configuration files in Config folder.

Just add just a few lines to LAPS.NANO.DSC.Install.ps1 and LAPS.Nano.DSC.Config.ps1 samples to create mof files for DSC.

In LAPS.Nano.DSC.Install.ps1 replace the last line with code as shown below:
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#<span class="SpellE">LAPS_Nano_Install -</span><span class="SpellE">ConfigurationData</span> $<span class="SpellE">ConfigData -</span>Ensure Present</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$<span class="SpellE">OutputPath</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">'C:\temp\LAPS\'</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$<span class="SpellE">ConfigName</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">'<span class="SpellE">LAPS_Nano_Install.mof</span>'</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span class="SpellE"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">LAPS_Nano_Install</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> -<span style="color: navy"><span class="SpellE">ConfigurationData </span></span><span style="color: orangered">$<span class="SpellE">ConfigData</span></span> -<span style="color: navy">Ensure</span> <span style="color: blueviolet">Present -</span><span style="color: navy"><span class="SpellE">OutputPath</span></span> <span style="color: orangered">$<span class="SpellE">OutputPath</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">Rename-Item -</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: navy">Path</span> <span style="color: darkred">"</span><span style="color: orangered">$<span class="SpellE">OutputPath</span></span><span style="color: darkred">\<span class="SpellE">localhost.mof</span>"</span> -<span style="color: navy"><span class="SpellE">NewName</span></span> <span style="color: orangered">$<span class="SpellE">ConfigName</span></span> -<span style="color: navy">Force</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">New-<span class="SpellE">DscChecksum</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> -<span style="color: navy">Path</span> <span style="color: darkred">"</span><span style="color: orangered">$<span class="SpellE">OutputPath</span></span><span style="color: darkred">\</span><span style="color: orangered">$<span class="SpellE">ConfigName</span></span><span style="color: darkred">"</span> -<span style="color: navy"><span class="SpellE">OutPath</span></span> <span style="color: orangered">$<span class="SpellE">OutputPath</span> </span></span></p>
 Running the script after modifications creates mof file with checksum:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image008.png"><img class=" size-full wp-image-185 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image008.png" alt="instalaltion mof file" width="614" height="130" /></a>

With config it will be little bit more tricky as we want to have 2 different configurations and want to change config name.
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white">In LAPS.Nano.DSC.Config.ps1 first setup LAPS client parameters as desired:</p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><a href="https://msdnshared.blob.core.windows.net/media/2016/06/image010.png"><img class="  wp-image-205 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image010.png" alt="image010" width="871" height="301" /></a></p>
Then I need to modify configurqtion name so as it matches the config name stored in LCM configuration:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image012.png"><img class=" size-full wp-image-195 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image012.png" alt="image012" width="332" height="42" /></a>

Then replace last line in script with code as shown below:
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#<span class="SpellE">LAPS_Nano_Config</span> -<span class="SpellE">ConfigurationData</span> $<span class="SpellE">ConfigData -</span>Ensure Present</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$<span class="SpellE">OutputPath</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">'C:\temp\LAPS\'</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$<span class="SpellE">ConfigName</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">'LAPSConfig1.mof'</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">LAPSConfig1 -</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: navy"><span class="SpellE">ConfigurationData</span></span> <span style="color: orangered">$<span class="SpellE">ConfigData</span></span> -<span style="color: navy">Ensure</span> <span style="color: blueviolet">Present </span><span style="color: navy"><span class="SpellE">-OutputPath</span></span> <span style="color: orangered">$<span class="SpellE">OutputPath</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">Rename-Item -</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: navy">Path</span> <span style="color: darkred">"</span><span style="color: orangered">$<span class="SpellE">OutputPath</span></span><span style="color: darkred">\<span class="SpellE">localhost.mof</span>"</span> -<span style="color: navy"><span class="SpellE">NewName</span></span> <span style="color: orangered">$<span class="SpellE">ConfigName</span></span> <span style="color: navy">-Force</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">New-<span class="SpellE">DscChecksum</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: navy">-Path</span> <span style="color: darkred">"</span><span style="color: orangered">$<span class="SpellE">OutputPath</span></span><span style="color: darkred">\</span><span style="color: orangered">$<span class="SpellE">ConfigName</span></span><span style="color: darkred">"</span> <span style="color: navy">-<span class="SpellE">OutPath</span></span> <span style="color: orangered">$<span class="SpellE">OutputPath</span> </span></span></p>
I’ll repeat steps above with ConfigName LAPSConfig2.mof, with password length 28 - copy sample config file, set paremeters as desired, and replacing last line in script, now specifying LAPSConfig2.mof as ConfigName.

As a result, we have 2 mof files with checksums:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image016.png"><img class=" size-full wp-image-215 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image016.png" alt="LAPS MOF files" width="627" height="229" /></a>

&nbsp;

<strong>3) Package LAPS.Nano.DSC module</strong> with resources and create checksum to zip file with name expected by DSC Pull Server (moduleName_Version):
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#remove space before version number in path below if you copy/paste - seems that blog engine does not like &lt;backslash&gt;&lt;zero&gt; combination</span></p>
<p class="MsoListParagraphCxSpFirst" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">Compress-Archive</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: navy">-Path</span> <span style="color: blueviolet">c:\temp\LAPS\LAPS.Nano.DSC\ 0.9.0.5\*</span> <span style="color: navy">-<span class="SpellE">DestinationPath</span></span> <span style="color: blueviolet">c:\temp\LAPS\Laps.Nano.DSC_0.9.0.5.zip</span></span></p>
<p class="MsoListParagraphCxSpLast" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">New-<span class="SpellE">DscChecksum</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: navy">-Path</span> <span style="color: blueviolet">c:\temp\LAPS\Laps.Nano.DSC_0.9.0.5.zip </span><span style="color: navy">-<span class="SpellE">OutPath</span></span> <span style="color: blueviolet">c:\temp\LAPS\ </span></span></p>
 So now I have mof file with LAPS.Nano.DSC module containing custom resources necessary for installation, and 2 mof files with configurations of LAPS client; all files with checksums:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image017.png"><img class=" size-full wp-image-216 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image017.png" alt="image017" width="627" height="257" /></a>

Now I need to transfer all files to DSC Pull Server.

&nbsp;

<strong>4) Put DSC Module with resources, and mof files with configurations to Pull server</strong>

Connect to DC that is running DSC Pull Server Service (Make sure you use enhanced session mode. You need to login, logoff and then the option will appear, if you login with different user than built-in admin for very first time) If you login with built-in admin, option will appear right after first login (no need to logoff)

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image018.png"><img class="  wp-image-235 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image018.png" alt="image018" width="757" height="415" /></a>

&nbsp;

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image020.png"><img class="  wp-image-225 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image020.png" alt="image020" width="753" height="322" /></a>

Copy Module files into the Pull Server modules storage:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image022.png"><img class=" size-full wp-image-255 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image022.png" alt="image022" width="642" height="109" /></a>

Copy Configuration files into the Pull Server configurations storage:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image024.png"><img class=" size-full wp-image-245 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image024.png" alt="image024" width="614" height="194" /></a>

&nbsp;

<strong>5) Start Nano VMs and enjoy!  </strong>

Start VMs one by one with some delay as shown in the script below.
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#example to start VMs one by one (run from Host)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple">1</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">..</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: purple">20</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: darkgray">|</span> <span style="color: blue">%</span> { </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: blue">    Start-VM</span> <span style="color: blueviolet">*Nano</span><span style="color: orangered">$_ </span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">    <span style="color: blue">Start-Sleep</span> <span style="color: purple">30</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">} </span></p>
If you start them all at the same time, you may bump into the following error:

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/image033.png"><img class="  wp-image-285 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image033.png" alt="image033" width="1200" height="172" /></a>

Nano VMs will automatically get configurations from Pull server. DSC will install and configure LAPS Client for Nano.

You can review configuration of VMs:
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#run this from DC</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#get <span class="SpellE">DSCconfig </span>status from Nano1 VM</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">(<span style="color: blue">Get-<span class="SpellE">DscConfigurationStatus -</span></span><span style="color: navy"><span class="SpellE">CimSession</span></span> <span style="color: blueviolet">nano1</span><span class="GramE">)<span style="color: darkgray">.</span><span class="SpellE">resourcesindesiredstate</span></span> <span style="color: darkgray">|</span> <span class="SpellE"><span style="color: blue">ft </span></span><span class="SpellE"><span style="color: blueviolet">ConfigurationName</span><span style="color: darkgray">,</span><span style="color: blueviolet">InstanceName</span><span style="color: darkgray">,</span><span style="color: blueviolet">InDesiredState</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#Push DSC <span class="SpellE">Config </span>again</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">Start-<span class="SpellE">DscConfiguration</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: navy"><span class="SpellE">ComputerName </span></span><span style="color: blueviolet">nano1</span> -<span style="color: navy"><span class="SpellE">UseExisting</span></span> <span style="color: navy">-Verbose -</span><span style="color: navy">Wait</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#Review LCM <span class="SpellE">Config</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">Get-<span class="SpellE">DscLocalConfigurationManager</span></span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> -<span style="color: navy"><span class="SpellE">CimSession </span></span><span style="color: blueviolet">nano1</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">(<span style="color: blue">Get-<span class="SpellE">DscLocalConfigurationManager -</span></span><span style="color: navy"><span class="SpellE">CimSession</span></span> <span style="color: blueviolet">nano1</span><span class="GramE">)<span style="color: darkgray">.</span><span class="SpellE">ConfigurationDownloadManagers</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">(<span style="color: blue">Get-<span class="SpellE">DscLocalConfigurationManager -</span></span><span style="color: navy"><span class="SpellE">CimSession</span></span> <span style="color: blueviolet">nano1</span><span class="GramE">)<span style="color: darkgray">.</span><span class="SpellE">PartialConfigurations</span></span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgreen">#review LAPS Client Settings</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">invoke-command -</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: navy"><span class="SpellE">ComputerName</span></span> <span style="color: blueviolet">nano1</span> -<span style="color: navy"><span class="SpellE">ScriptBlock</span></span> {<span style="color: blue">Get-<span class="SpellE">ItemProperty</span></span> <span style="color: darkred">"HKLM:\software\policies\Microsoft Services\<span class="SpellE">AdmPwd</span>\"</span>}</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;line-height: normal;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">get-service -</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"><span style="color: navy"><span class="SpellE">ComputerName</span></span> <span style="color: blueviolet">nano1</span> -<span style="color: navy">Name</span> <span style="color: blueviolet">*Laps* </span></span></p>
&nbsp;

<strong>6) OK, one more step is needed to make  solution working</strong>

I need to configure environment for LAPS in my lab - extend the AD schema and delegate permissions:
<ul>
	<li>Download LAPS <a href="https://www.microsoft.com/en-us/download/details.aspx?id=46899">https://www.microsoft.com/en-us/download/details.aspx?id=46899</a></li>
	<li>Install LAPS on DC with following settings:</li>
</ul>
<p style="padding-left: 90px"><a href="https://msdnshared.blob.core.windows.net/media/2016/06/image025.png"><img class="  wp-image-265 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image025.png" alt="image025" width="444" height="348" /></a></p>

<ul>
<ul>
	<li>Note: You don’t need GPO templates on DC for this lab with Nano servers, as LAPS for Nano does not use GPO at all. However, for real environment with mixed Nano and “normal” machines, you will need GPO templates as “normal” machines still receive configuration via GPO</li>
	<li>Run <code>Update-AdmPwdADSchema</code> from PowerShell to extend AD schema.</li>
	<li>Run <code>Set-AdmPwdComputerSelfPermission -identity:Workshop</code> from PowerShell to delegate computer permission to write password under OU Workshop</li>
	<li>Wait some time and check password of managed admin account on Nano machines reported to AD:</li>
</ul>
</ul>
<p style="padding-left: 90px"><a href="https://msdnshared.blob.core.windows.net/media/2016/06/image026.png"><img class=" size-full wp-image-275 alignnone" src="https://msdnshared.blob.core.windows.net/media/2016/06/image026.png" alt="image026" width="378" height="301" /></a></p>
That’s it! See you next time! – probably on <a href="https://blogs.technet.microsoft.com/askpfeplat/">askpfeplat </a>blog where I’ll show you how crazy fast and small nano server is.

Jaromirk@MSFT

Update 11.6.2015:

- Fixed typo in script Variables.ps1

- Optimized script 3_Deploy.ps1]]></content:encoded>
    </item>
    <item>
      <title>LAPS and Nano Server</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-and-nano-server</link>
      <pubDate>Tue, 10 May 2016 15:38:48 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/?p=66</guid>
      <description><![CDATA[Some of you know that the new Windows Server 2016 "Nano Server" deployment option will not support...]]></description>
      <content:encoded><![CDATA[Some of you know that the new Windows Server 2016 "Nano Server" deployment option will not support Group Policy, and may be asking how you are expected to manage local administrator's password on it.

Good news is that we're working on the implementation of the <a href="https://technet.microsoft.com/en-us/mt227395.aspx">Local Administrator Password Solution</a> (LAPS) client for Nano server, so that managing local administrator's passwords will be possible there, too!

This article describes an early version of LAPS client for Nano server, so if you are interested, read further to find out how to download, install and test.<!--more-->

LAPS client for Nano Server has different implementation than the "classic" LAPS client:
<ul>
 	<li>Rather than GPO Client Side Extension (CSE), LAPS client for Nano Server is implemented as a Windows Service</li>
 	<li>Configuration parameters (password complexity, age, etc.) are still taken from Windows registry, but are distributed there by the PowerShell Desired State Configuration (DSC), rather than Group Policy.</li>
</ul>
Apart from this, we kept the implementation aligned with the "classic" LAPS, so you can still:
<ul>
 	<li>Find the configuration parameters at the same place in registry (HKLM\Software\Policies\Microsoft Services\AdmPwd)</li>
 	<li>See event source AdmPwd in the Application log, with the same Event IDs and messages</li>
</ul>
What to do if you want to test LAPS client for Nano Server in your environment?

<hr />

<strong>Update 23.11.2016</strong>

PS Gallery was updated with RTM version of LAPS Client for Nano. Tested on Nano server with October 2016 Cumulative Update.

Current version is 1.0.0.5.

Steps below article below was slightly modified so as it applies to RTM version.

Enjoy,

Jiri

<hr />

<h1>Prerequisites</h1>
<ul>
 	<li>Solution was tested on TP5 of Nano server, and is not expected to work on earlier builds of Nano</li>
 	<li>Solution only works on Nano server - it is not designed to run on standard Windows 2016 server, or on earlier versions of Windows</li>
 	<li>Solution depends on PowerShell DSC. Depending on where you will test it, you may need to install PowerShell DSC
<ul>
 	<li>Azure VM provisioned from Nano RTM image in Azure VM gallery needs this</li>
 	<li>Installation commands for your reference:</li>
</ul>
</li>
</ul>
<p style="padding-left: 60px"><code> Save-Module -Path "$Env:ProgramFiles\WindowsPowerShell\Modules\" -Name NanoServerPackage -MinimumVersion 1.0.1.0
Import-PackageProvider NanoServerPackage
Find-NanoServerPackage Microsoft-NanoServer-DSC-Package | Install-NanoServerPackage
</code></p>

<ul>
 	<li>Solution expects that Nano server is joined to domain - join it via djoin prior installing</li>
 	<li>For remote management using GUI tools (event viewer, etc.), you may want to enable firewall rules via <code>Enable-NetFirewallRule</code></li>
 	<li>Solution expects AD permissions delegation the same as for "classic" LAPS client - perform the necessary delegations via <code>Set-AdmPwdComputerSelfPermission</code> cmdlet, if needed</li>
</ul>
<strong>Important</strong>: Solution is still work in progress - the same as Nano server is. So expect updated versions from time to time. Final code will be released after Nano is finished
<h1>Installation</h1>
We published module <strong>LAPS.Nano.DSC</strong> to PowerShell Gallery. Simply connect to your Nano server, find it and install it:

<code>Enter-PSSession -ComputerName MyNanoServer</code>

<code>Find-Module LAPS.Nano.DSC | Install-Module</code>

Module gets installed to %ProgramFiles%\WindowsPowerShell\Modules\LAPS.Nano.DSC\&lt;version&gt;

What gets installed?
<table border="1" width="800">
<tbody>
<tr>
<td bgcolor="lightgrey" width="275">File</td>
<td bgcolor="lightgrey">Description</td>
</tr>
<tr>
<td>LAPS.Nano.DSC.psd1</td>
<td>Module definition file</td>
</tr>
<tr>
<td>LAPS.Nano.DSC.psm1</td>
<td>Module implementation that contains DSC resource for LAPS client installation/uninstallation/upgrade</td>
</tr>
<tr>
<td>Config\LAPS.Nano.DSC.Config.ps1</td>
<td>Sample DSC configuration for  maintenance of LAPS client parameters (password length, complexity, etc)</td>
</tr>
<tr>
<td>Config\LAPS.Nano.DSC.Install.ps1</td>
<td>Sample DSC configuration for LAPS client installation</td>
</tr>
<tr>
<td>Redist\msvcp140.dll</td>
<td>VC++ runtime</td>
</tr>
<tr>
<td>Redist\vcruntime140.dll</td>
<td>VC++ runtime</td>
</tr>
<tr>
<td>Runtime\LAPS.Nano.Service.exe</td>
<td>LAPS client for Nano binary</td>
</tr>
<tr>
<td>Runtime\Messages.man</td>
<td>ETW manifest for EventLog service</td>
</tr>
</tbody>
</table>
<h1>How to install</h1>
All installation tasks are done directly on Nano server.

After LAPS.Nano.DSC module is installed, you first need to create configuration data in registry. You are expected to take sample configuration installed with module, modify it if necessary, and create .mof file:

<code>Enter-PSSession -ComputerName MyNanoServer</code>

<code>&amp;"$env:ProgramFiles\WindowsPowerShell\Modules\LAPS.Nano.DSC\&lt;version&gt;\Config\LAPS.Nano.DSC.Config.ps1"</code>

<em>Note</em>: Replace &lt;version&gt; with actual version of DSC module

localhost.mof is created in LAPS_Nano_Config subfolder of current folder (in my case, it's C:\Temp), and it's ready to be applied to local machine:

<code>Start-DscConfiguration -Wait -Force -Path C:\Temp\LAPS_Nano_Config -Verbose</code>

After configuration is applied, you should see configuration created in registry of Nano server:

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/LAPS.Nano_.DSC_.jpg"><img class="aligncenter wp-image-86" src="https://msdnshared.blob.core.windows.net/media/2016/05/LAPS.Nano_.DSC_.jpg" alt="LAPS.Nano.DSC - Registry configuration" width="570" height="215" /></a>

&nbsp;

Then create configuration for LAPS client installation:

<code>&amp;"$env:ProgramFiles\WindowsPowerShell\Modules\LAPS.Nano.DSC\&lt;version&gt;\Config\LAPS.Nano.DSC.Install.ps1"</code>

localhost.mof is created in LAPS_Nano_Install subfolder of current folder (in my case, it's C:\Temp), and it's ready to be applied to local machine:

<code>Start-DscConfiguration -Wait -Force -Path C:\Temp\LAPS_Nano_Install -Verbose</code>

Installation is performed by DSC resource cLapsNanoInstall. It performs the following tasks:
<ul>
 	<li>Copies VC++ runtime to %SystemRoot%\System32</li>
 	<li>Copies LAPS client binaries to %ProgramFiles%\AdmPwd\CSE\</li>
 	<li>Registers ETW manifest for event logging</li>
 	<li>Installs LAPS.Nano Windows Service</li>
 	<li>Starts the service</li>
</ul>
After command finishes, you should see LAPS.Nano service installed and running:

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/LAPS.Nano_.DSC_.Service.jpg"><img class="aligncenter wp-image-95" src="https://msdnshared.blob.core.windows.net/media/2016/05/LAPS.Nano_.DSC_.Service.jpg" alt="LAPS.Nano.DSC.Service" width="596" height="82" /></a>

&nbsp;

After 20 mins (default password management cycle interval), you should see events from source = AdmPwd in Application Event Log - sample configuration provided turns on detailed logging.

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/LAPS.Nano_.DSC_.EventViewer.jpg"><img class="aligncenter wp-image-105" src="https://msdnshared.blob.core.windows.net/media/2016/05/LAPS.Nano_.DSC_.EventViewer.jpg" alt="LAPS.Nano.DSC.EventViewer" width="597" height="228" /></a>

&nbsp;

And then you should be able to see password of local Administrator account via LAPS management tools, and use it for logon...
<h1>Frequently asked questions</h1>
<strong>Q</strong>: What if you release new version of LAPS.Nano client? How do I upgrade?

<strong>A</strong>: Just download new version of LAPS.Nano.DSC module, create installation MOF file with Ensure = 'Present' as shown above, and apply updated configuration. DSC resource cLapsNanoInstall upgrades LAPS client to latest version

&nbsp;

<strong>Q</strong>: I uninstalled LAPS client, but VC++ runtime DLLs weren't removed. Is this expected?

<strong>A</strong>: Yes. Currently, we don't uninstall VC++ runtime during LAPS client uninstall

&nbsp;

(more Q/A to be added if they're coming)

&nbsp;

Looking forward for your feedback!]]></content:encoded>
    </item>
    <item>
      <title>LAPS and permission to join computer to domain</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-and-permission-to-join-computer-to-domain</link>
      <pubDate>Fri, 17 Jul 2015 12:45:00 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/2015/07/17/laps-and-permission-to-join-computer-to-domain/</guid>
      <description><![CDATA[Some you may have noticed that some users may be able to read local admin passwords on some...]]></description>
      <content:encoded><![CDATA[<p class="MsoNormal"><span lang="EN-US">Some you may have noticed that some users may be able to read local admin passwords on some computers without being delegated permission to do so by LAPS administrators. If you’re asking how is it possible, read further.</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><strong><span style="font-size: medium">Creation of computer account</span></strong></p>
<p class="MsoNormal"><span lang="EN-US">Let’s first explain, how ACL on new AD object is created:</span><span lang="EN-US" style="font-family: Symbol"><span style="font: 7.0pt 'Times New Roman'"> </span></span></p>

<ul>
 	<li class="MsoNormal"><span lang="EN-US" style="text-indent: -18pt">Domain controller finds appropriate class in AD schema</span></li>
 	<li><span lang="EN-US" style="text-indent: -18pt">DC creates instance of AD object based appropriate schema class in AD container chosen by user</span></li>
 	<li><span lang="EN-US" style="text-indent: -18pt">During creation DC saves relevant inheritable ACEs from ACL of parent container into ACL of newly created object as inherited permissions</span></li>
 	<li><span lang="EN-US" style="text-indent: -18pt">Then DC takes value of „defaultSecurityDescriptor“ attribute of appropriate AD schema class and saves it to ACL of newly created object as non-inherited ACEs</span></li>
 	<li>So ACEs in ACLs of newly created objects come from 2 sources: from parent container and from AD schema class definition.</li>
</ul>
<p class="MsoNormal"><span lang="EN-US">Then, remember that when computer objects are created via DSA.msc console, wizard asks user to specify security principal who will be allowed to join computer to domain. When this principal is specified, then prior adding non-inherited ACEs (from defaultSecurityDescriptor) to ACL of created object, wizard replaces CREATOR OWNER SID in all ACEs by SID of security principal chosen for being able to join computer to domain – so effectively, joiner of computer to domain receives all permissions for CREATOR OWNER as they were defined on computer class in AD schema.</span></p>
<p class="MsoNormal"><span lang="EN-US">Content of defaultSecurityDescriptor on computer class in schema looks like this (taken from 2012R2 schema; in older versions may vary):</span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">"D:(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;;RPCRLCLORCSDDT;;;CO)(OA;;WP;4c164200-20c0-11d0-a768-00aa006e0529;;CO)(A;;RPLCLORC;;;AU)(OA;;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;;WD)(A;;CCDC;;;PS)(OA;;CCDC;bf967aa8-0de6-11d0-a285-00aa003049e2;;PO)(OA;;RPWP;bf967a7f-0de6-11d0-a285-00aa003049e2;;CA)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;PS)(OA;;RPWP;77B5B886-944A-11d1-AEBD-0000F80367C1;;PS)(OA;;SW;72e39547-7b18-11d1-adef-00c04fd8d5cd;;PS)(OA;;SW;72e39547-7b18-11d1-adef-00c04fd8d5cd;;CO)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;CO)(OA;;WP;3e0abfd0-126a-11d0-a060-00aa006c33ed;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;WP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;WP;bf967950-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;WP;bf967953-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;RP;46a9b11d-60ae-405a-b7e8-ff8a58d456d2;;S-1-5-32-560)"</span></p>
<p class="MsoNormal"><span lang="EN-US">Let’s see, what’s defined in it for CREATOR OWNER. We use simple PowerShell script:</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$defaultSD</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">"D:(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;;RPCRLCLORCSDDT;;;CO)(OA;;WP;4c164200-20c0-11d0-a768-00aa006e0529;;CO)(A;;RPLCLORC;;;AU)(OA;;CR;ab721a53-1e2f-11d0-9819-00aa0040529b;;WD)(A;;CCDC;;;PS)(OA;;CCDC;bf967aa8-0de6-11d0-a285-00aa003049e2;;PO)(OA;;RPWP;bf967a7f-0de6-11d0-a285-00aa003049e2;;CA)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;PS)(OA;;RPWP;77B5B886-944A-11d1-AEBD-0000F80367C1;;PS)(OA;;SW;72e39547-7b18-11d1-adef-00c04fd8d5cd;;PS)(OA;;SW;72e39547-7b18-11d1-adef-00c04fd8d5cd;;CO)(OA;;SW;f3a64788-5306-11d1-a9c5-0000f80367c1;;CO)(OA;;WP;3e0abfd0-126a-11d0-a060-00aa006c33ed;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;WP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;WP;bf967950-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;WP;bf967953-0de6-11d0-a285-00aa003049e2;bf967a86-0de6-11d0-a285-00aa003049e2;CO)(OA;;RP;46a9b11d-60ae-405a-b7e8-ff8a58d456d2;;S-1-5-32-560)"</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$sec</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">New-Object</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: blueviolet">System.DirectoryServices.ActiveDirectorySecurity</span></span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$sec</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">.</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">SetSecurityDescriptorSddlForm(<span style="color: orangered">$defaultSD</span>)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$acc</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">=</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: blue">New-Object</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'"> <span style="color: blueviolet">System.Security.Principal.NTAccount</span>(<span style="color: darkred">"CREATOR OWNER"</span>)</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt;background: white"><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: orangered">$sec</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkgray">.</span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console'">GetAccessRules(<span style="color: orangered">$true</span><span style="color: darkgray">,</span><span style="color: orangered">$false</span><span style="color: darkgray">,[</span><span style="color: teal">System.Security.Principal.NTAccount</span><span style="color: darkgray">]</span>) <span style="color: darkgray">|</span> <span style="color: blue">Where-Object</span> {<span style="color: orangered">$_</span><span style="color: darkgray">.</span>IdentityReference <span style="color: darkgray">-eq</span> <span style="color: orangered">$acc</span>}</span></p>
<p class="MsoNormal" style="margin-top: 12.0pt">Script gives the list of ACEs for CREATOR OWNER; one of them is as shown below:</p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">ActiveDirectoryRights : DeleteTree, <span style="background: yellow">ExtendedRight</span>, Delete, GenericRead</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">InheritanceType       : None</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">ObjectType            : 00000000-0000-0000-0000-000000000000</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">InheritedObjectType   : 00000000-0000-0000-0000-000000000000</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">ObjectFlags           : None</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">AccessControlType     : Allow</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">IdentityReference     : CREATOR OWNER </span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">IsInherited           : False</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">InheritanceFlags      : None</span></p>
<p class="MsoNormal" style="margin-bottom: .0001pt"><span style="font-size: 9.0pt;font-family: 'Lucida Console'">PropagationFlags      : None</span></p>
<p class="MsoNormal"><span lang="EN-US">See highlighted ExtendedRight above: this access right gives the permission to read confidential attributes!</span></p>
<p class="MsoNormal"><span lang="EN-US">So this explains why some users may read LAPS passwords without being granted permission to do so – they were given the permission to join computer object(s) to domain, and can read the password on computers they joined!</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="font-size: small"><strong><span lang="EN-US">So best practice</span></strong></span><span lang="EN-US">: Join computers to domain using dedicated service account, use automated tools, such as SCCM OSD rather than allowing users to join computers to domain themselves – you are protecting your confidential attributes in AD.</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="font-size: medium"><strong><span lang="EN-US">Going further</span></strong></span></p>
<p class="MsoNormal"><span lang="EN-US">Some of you may ask the same question I asked: Is the ExtendedRight permission really necessary for ability to join computers to domain? Let’s test:</span></p>

<ul>
 	<li><span lang="EN-US" style="text-indent: -18pt">Change defaultSecurityDescriptor to remove ExtendedRight from CREATOR OWNER:</span>
<ul>
 	<li><span lang="EN-US" style="text-indent: -18pt">Change </span><span lang="EN-US" style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">(A;;RP<span style="text-decoration: line-through"><span style="background: yellow">CR</span></span>LCLORCSDDT;;;CO) </span><span lang="EN-US" style="text-indent: -18pt">to</span><span style="font-size: 9.0pt;font-family: 'Lucida Console';color: darkred">(A;;RPLCLORCSDDT;;;CO)</span></li>
</ul>
</li>
 	<li><span lang="EN-US" style="text-indent: -18pt">Create new computer object, specifying some test user as joiner</span></li>
 	<li><span lang="EN-US" style="text-indent: -18pt">Let joiner join computer to domain. Will he succeed? Yes! This means that missing ExtendedRight permission does not impact the ability to join computer to domain</span></li>
 	<li><span lang="EN-US" style="text-indent: -18pt">Install LAPS CSE on joined computer and let CSE upload admin password to AD</span></li>
 	<li><span lang="EN-US" style="text-indent: -18pt">Let joiner to use LAPS UI or PowerShell to see if he can read password of local admin for newly joined computer. Will he succeed? No! this means that removal of ExtendedRight permission from defaultSecurityDescriptor on computer class in AD schema prevents security principals delegated to join computers to domain from reading confidential attributes on newly created computer objects (but not on already existing objects)</span></li>
</ul>
<p class="MsoNormal"><span lang="EN-US">Reason why the ExtendedRight is there is not very well documented – maybe guys from AD development team will know better.</span></p>
<p class="MsoNormal"><span lang="EN-US">So you <em>may</em> consider changing defaultSecurityDescriptor appropriately. However, as always: test changes thoroughly, review your processes for any dependencies, and be ready to revert to original state.<a></a></span></p>
<p class="MsoNormal"><strong>UPDATE 9.8.2016</strong></p>
<p class="MsoNormal">Even with the measures above that limit ExtendedRight permission assignment to account that creates computer account in domain, creator of the account becomes OWNER of computer account, which gives permission to modify ACL on computer account and elevate permissions.</p>
<p class="MsoNormal">In Windows 2008 and higher version of DC, this can be prevented by usage of Owner Rights, as described in <a target="_blank" href="https://technet.microsoft.com/en-us/library/dd125370(v=ws.10).aspx">this TechNet article</a>.</p>
<p class="MsoNormal">So if you care about security of password stored by LAPS in Active Directory, proper usage of Owner Rights prevents computer object creators modify ACL and elevate permissions.</p>
<p class="MsoNormal">Credit goes to Tiernan Messmer for pointg out.</p>
<p class="MsoNormal">Jiri</p>
<p class="MsoNormal"></p>
<p class="MsoNormal"></p>
<p class="MsoNormal"></p>
<p class="MsoNormal"></p>
<p class="MsoNormal"></p>]]></content:encoded>
    </item>
    <item>
      <title>LAPS updated to 6.0.1</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-updated-to-6-0-1</link>
      <pubDate>Fri, 17 Jul 2015 10:41:00 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/2015/07/17/laps-updated-to-6-0-1/</guid>
      <description><![CDATA[Hello,
We released update to LAPS last week. Changes in new version:

Fixed bug that caused...]]></description>
      <content:encoded><![CDATA[<p>Hello,</p>
<p>We released update to LAPS last week. Changes in new version:</p>
<ul>
<li>Fixed bug that caused computer account not to be found by LAPS UP and LAPS Powershell in forest containing multiple domain trees, and computer account was in different domain tree than tree of forest root domain</li>
<li>Added &ndash;SchemaNotUpdated switch parameter to cmdlet Find-AdmPwdExtendedPermissions that allows running this cmdlet in AD forest that does not contain LAPS AD schema update. Previously, doing this caused &bdquo;No such object found&ldquo; error, because cmdlet looked for LAPS schema attribute in AD schema</li>
<li>LAPS UI: Replaced text box for password expiration with datetime picker</li>
<li>Fixed typos and better wording in ADMX templates</li>
<li>Updated documentation</li>
</ul>
<p>&nbsp;Download location did not change, so visit <a href="https://www.microsoft.com/en-us/download/details.aspx?id=46899">Download center</a> for download</p>
<p>Jiri</p>]]></content:encoded>
    </item>
    <item>
      <title>LAPS and MS14-025</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-and-ms14-025</link>
      <pubDate>Fri, 19 Jun 2015 10:17:00 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/2015/06/19/laps-and-ms14-025/</guid>
      <description><![CDATA[This short post is to remind you few things regarding coexistence of LAPS and local account password...]]></description>
      <content:encoded><![CDATA[<p>This short post is to remind you few things regarding coexistence of LAPS and local account password management via Group Policy Preferences (GPP) after installing hotfix <a title="2928120" href="https://support.microsoft.com/en-us/kb/2928120">2928120</a>&nbsp;&nbsp;</p>
<p>Management of local account passwords via GPP was not best thing to do from security perspective, so this functionality was disabled by hotfix mentioned above.</p>
<p>However, installation of hotfix just disbles ability of making changes to relevant parts of GPP, but keeps current settings in place, so as not to disrupt &nbsp;processes that may be in place and rely on settings distributed by GPP.</p>
<p>When installing LAPS into the environment, people may forgot to remove local administrator password management settings from GPP, thinking it was removed by installation of the hotfix mentioned above. This results in having two independent processes managing password of local administrator account and invalidates password that LAPS stores in AD in computer account.</p>
<p>So when installing LAPS, please <strong>always make sure that local administrator password management settings are removed from GPP</strong> prior deploying LAPS.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>LAPS and password storage in clear text in AD</title>
      <link>https://docs.microsoft.com/archive/blogs/laps/laps-and-password-storage-in-clear-text-in-ad</link>
      <pubDate>Mon, 01 Jun 2015 08:36:00 GMT</pubDate>
      <dc:creator><![CDATA[Jiri Formacek]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/laps/2015/06/01/laps-and-password-storage-in-clear-text-in-ad/</guid>
      <description><![CDATA[People often ask me why we decided to store password in clear text in AD when implementing LAPS....]]></description>
      <content:encoded><![CDATA[<p>People often ask me why we decided to store password in clear text in AD when implementing LAPS. Let's answer the question now and give guidelines on how to deal with passwords of local administrator accounts stored in AD.</p>
<p>Main reason for the decision to store password in AD as clear text was simplicity of the solution: focus was on implementation of Client Side GPO extension that manages local administrator account on local machine, and get the result (password and expiration timestamp to AD. Administrators can then use tools provided with the solution (PowerShell cmdlet of LAPS UI client), or built-in tool (such as dsa.msc)&nbsp;to retrieve the password.</p>
<p>When considering encryption of password in AD, implementation needs to decide how to protect and distribute decryption key:</p>
<ul>
<li><strong>Symmetric encryption/decryption algorithms</strong> are not good here: key would also be used for encryption, so it would need to be known by all managed machines that are expected to encrypt password using it, plus administrators who need it for decryption of password. Not good. Maybe separate key for each machine? A lot of keys would be needed, which is not good, and still there is a need to make sure that only approved admins have access to the key to perform decryption of password</li>
<li><strong>Asymmetric encryption/decryption algorithm</strong>? Probably a better solution: encryption would use public key, so all managed machines can easily use the same key, but still, there is a challenge to solve: how to make distribute private key to administrators who need it for password decryption. Probably best way would be to implement a central service that would be owner of private key and used it for password decryption. This would work, but it's far from simple design that was the original goal</li>
</ul>
<p>Actually, there are 2 sides of story when speaking about password stored as clear text in AD:</p>
<ol>
<li>Password protection while stored in AD</li>
<li>Password protection during the transport to end user who needs it</li>
</ol>
<h1>Password protection when stored in AD</h1>
<h2><span lang="EN-US">Permission to read the password from AD</span></h2>
<p>As you probably know, <span style="font-family: 'courier new', courier;">ms-Mcs-AdmPwd</span> attribute that stores password in AD is marked as&nbsp;<em>Confidential</em>&nbsp;in AD - this means that users need to have extra permission (CONTROL_ACCESS permission) to read the value - Read permission is not enough. AD honors the read request for confidential attribute value when at least one of the following is true:</p>
<ul>
<li>Caller is granted 'Full Control' permission</li>
<li>Caller is granted 'All Extended Rights' permission</li>
<li>Caller is granted 'Control Access' on the attribute permission (this is what LAPS PowerShell uses to grant the permission)</li>
</ul>
<p>So it's important that AD administrators detect who has permission to read the password before managed machines start reporting password to AD and align permissions with desired administration model to prevent password reads by people who should not be allowed to.</p>
<p>There is LAPS PowerShell cmdlet that helps identify who effectively has permission to read password, so IT admins can change permission delegation model to remove the read password permission from people who should not have it &ndash; cmdlet name is <span style="font-family: 'courier new', courier;">Find-AdmPwdExtendedRights</span></p>
<h2><span style="font-size: large;">Theft of Domain controller and harvesting for passwords stored there</span></h2>
<p>Yes, theft can happen. AD database itself is one of biggest security assets of company and as such, needs to be protected properly. Protect your AD backups and you will protect local administrator passwords stored there as well.</p>
<p>For physically insecure environments, consider using Read Only Domain Controllers (RODC). <span style="font-family: 'courier new', courier;">ms-Mcs-AdmPwd</span> attribute is flagged not to replicate its value to RODC, so theft of RODC will not reveal any local administrator passwords to the thief.</p>
<p>Also, <span style="font-family: 'courier new', courier;">ms-Mcs-AdmPwd</span> attribute is flagged so as DC does not audit change of values - so harvesting of security logs of domain controllers will not reveal any local administrator passwords.</p>
<h1>Password protection during transit</h1>
<p>LAPS tools have built-in protection for password transport implemented. Protection is based on &lsquo;Kerberos encryption&rsquo; that&rsquo;s available out of box for domain joined machines for a few protocols including LDAP. Both LAPS PowerShell and LAPS UI use this protection to make sure that password is protected during transit.</p>
<p>However, it&rsquo;s important to understand, that this protection cannot be enforced from DC side, and it always needs to be initiated from client side, so keep this in mind when you choose to use different tools or decide to develop own tools instead.</p>
<h2>Support for encryption from tools available on platform</h2>
<p>Recent versions of common MS tools do a good job in terms of securing data during transport:</p>
<ul>
<li>Dsa.msc: uses encrypted connection by default</li>
<li>Adsiedit.exe: uses encrypted connection, even when configured not to use LDAP/SSL</li>
<li>Ldp.exe: offers to use encrypted connection by default, when binding:</li>
</ul>
<div><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/71/03/2821.ldp.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-71-03/2821.ldp.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/71/03/2821.ldp.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/200x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-71-03/2821.ldp.png" alt="" border="0" /></a></div>
<p>&nbsp;However, with LDP, you can connect unencrypted if you want to, provided you know what you&rsquo;re doing</p>
<p><strong>Recommendation</strong>: always use SW that encrypts traffic when retrieving data from AD &ndash; either Kerberos encryption, or &ndash; if your DCs have a SSL certificate &ndash; use SSL connections whenever possible.</p>
<h2>Your own code</h2>
<p>Let&rsquo;s see below on typical approaches for AD data retrieval and how to make sure that data is protected during transport</p>
<h3>ADSI</h3>
<p>Simple PowerShell script using ADSI is usually a bad choice:</p>
<p><span style="font-family: 'courier new', courier;">$comp=[adsi]"LDAP://CN=MyComputer,OU=LAPS,DC=MyDomain,DC=com"</span></p>
<p><span style="font-family: 'courier new', courier;">$comp."ms-mcs-admpwd"</span></p>
<p>&nbsp;This script reveals password on the network. Never use ADSI this way. If you must use ADSI, always use&nbsp; IADsOpenDSObject interface and specify USE_SIGNING and USE_SEALING in OpenDSObject method. See <a href="https://msdn.microsoft.com/en-us/library/aa706065(v=vs.85).aspx">https://msdn.microsoft.com/en-us/library/aa706065(v=vs.85).aspx</a> for more details.</p>
<h3>AD Powershell</h3>
<p><span style="font-family: 'courier new', courier;">Get-ADComputer</span> cmdlet uses AD WS rather than LDAP, and connection uses SSL, so password is protected during transport</p>
<h3>System.DirectoryServices namespace in .NET Framework</h3>
<p>Objects is this namespace are based on ADSI, so generally, it tends not to protect transmitted data by default. To ensure protection, make sure you turn it on before touching a directory object, as shown on simple PowerShell script below:</p>
<p><span style="font-family: 'courier new', courier;">$comp=new-object System.DirectoryServices.DirectoryEntry</span></p>
<p><span style="font-family: 'courier new', courier; background-color: #ffff00;">$comp.AuthenticationType=$comp.AuthenticationType -bor [System.DirectoryServices.AuthenticationTypes]::Sealing</span></p>
<p><span style="font-family: 'courier new', courier; background-color: #ffff00;">$comp.AuthenticationType=$comp.AuthenticationType -bor [System.DirectoryServices.AuthenticationTypes]::Secure</span></p>
<p><span style="font-family: 'courier new', courier;">$comp.Path="LDAP://CN=MyComputer,OU=LAPS,DC=MyDomain,DC=com "</span></p>
<p><span style="font-family: 'courier new', courier;">$comp.Properties["ms-mcs-admpwd"]</span></p>
<h3>System.DirectoryServices.Protocols in .NET Framework</h3>
<p>Personally, API of my choice for managed programming; robust and powerful (see my sample on how to use it in PowerShell here: <a href="https://gallery.technet.microsoft.com/Using-SystemDirectoryServic-0adf7ef5">https://gallery.technet.microsoft.com/Using-SystemDirectoryServic-0adf7ef5</a>).. However, encryption needs to be turned on explicitly on LdapConnection object, as shown on PowerShell script below:</p>
<p><span style="font-family: 'courier new', courier;">[System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices.Protocols") | Out-Null</span></p>
<p><span style="font-family: 'courier new', courier;">$directory=new-object System.DirectoryServices.Protocols.LdapDirectoryIdentifier("MyDC.MyDomain.com", 389)</span></p>
<p><span style="font-family: 'courier new', courier;">$LdapConnection=new-object System.DirectoryServices.Protocols.LdapConnection($directory)</span></p>
<p><span style="font-family: 'courier new', courier; background-color: #ffff00;">$LdapConnection.SessionOptions.Sealing=$true</span></p>
<p><span style="font-family: 'courier new', courier; background-color: #ffff00;">$LdapConnection.SessionOptions.Signing=$true</span></p>
<h2>&nbsp;<span style="font-size: 2em;">Conclusion</span></h2>
<p>Even when password is stored as clear text in AD by LAPS, still the solution provides significant amount of security:</p>
<ul>
<li>Password is protected by ACL</li>
<li>Password is not replicated to RODC and is not revealed in audit logs on DC</li>
<li>Is protected in transit by LAPS tools</li>
</ul>
<p>You only need to understand how the password is protected and use the solution a proper way to keep the password secure</p>]]></content:encoded>
    </item>
  </channel>
</rss>