I’ve posted a lot of PowerShell scripts here over the years. Some good, some not-so-good. Okay, mostly not-so-good. Besides my very obvious lack of PowerShell prowess, one thing has constantly bugged me about a few of the scripts I’ve written, they contain passwords in plain text. Here are a few examples:
How to Upload Files to SharePoint 2013 with PowerShell
How to schedule SharePoint backups with PowerShell
The PowerShell script I use to create Active Directory users
Using PowerShell to set up a test environment
How to use PowerShell to replace DCPROMO in Windows Server 2012
In each of those scripts I did a bad, bad thing, I put the password for a privileged account in plain text. Shame on me. My penance for this sin is that I have to write this blog post, explaining a more secure way to handle this situation. I also said “Hail Jeff Snover” 100 times.
The TLDR version is that instead of putting the passwords in plain text in the script, we should save them, encrypted in a file, and use them from there. PowerShell is constantly improving. It’s getting stronger. I’m pretty sure Skynet uses PowerShell when it takes over the world. SharePoint 2010 uses PowerShell v2, which has one way to save encrypted passwords. SharePoint 2013 uses PowerShell v3, which has a better way. I’ll show you both here. Both versions will work with SharePoint 2013, only the first will work with SharePoint 2010. And yes, while you can install PowerShell v3 on a server running SharePoint 2010, you can’t use the SharePoint 2010 SnapIn in PowerShell v3, so you’d have to use the PowerShell v2 regardless.
SharePoint 2010 (PowerShell v2)
First, we need to create the file that contains the encrypted password. Here is the PowerShell I use to do that:
$password = Read-Host "Enter Password: " -AsSecureString
$filename = Read-Host "Enter file to save as: "
$secure = ConvertFrom-SecureString $password
$secure | Out-File $filename
Here’s what it looks like in practice:
The password I entered was the venerable pass@word1. You can see the file it creates is plain text, but it bears no resemblance at all to pass@word1 so bad guys can’t see what your passwords are.
Of course creating the encrypted password is only half the battle, and maybe even the easy half. You actually have to be able to use the password for this to be any fun. Let’s look at the How to Upload Files to SharePoint 2013 with PowerShell blog post. Scenario 2 could take advantage of this. Let’s look at the piece of the original script that dealt with authentication:
# Since we’re doing this remotely, we need to authenticate
$securePassword = ConvertTo-SecureString "pass@word1" -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential ("contoso\johnsmith", $securePassword)
There’s that password in plain text <shudder>. Let’s fix that. Here’s what it would look like using the file we created above:
# Since we’re doing this remotely, we need to authenticate
$temp = Get-Content C:\temp\secretfile.txt
$securePassword = ConvertTo-SecureString -String $temp
$credentials = New-Object System.Management.Automation.PSCredential ("contoso\johnsmith", $securePassword)
Now you can run your scripts with piece of mind. Let’s check out the SharePoint 2013 version.
SharePoint 2013 (PowerShell v3)
The PowerShell v3 method is a little smoother. Here’s how we create the file:
$credentials = Get-Credential
$filename = 'C:\temp\secretfile.txt’
$credentials | Export-CliXml -Path $filename
Notice that the file stores both the username and the password, not just the password like the v2 version. Here’s how you would use it in the same example as above:
# Since we’re doing this remotely, we need to authenticate
$credPath = 'C:\temp\secretfile.txt’
$credentials = Import-CliXml -Path $credPath
That would replace the entire section, not just the yellow highlighted pieces that the PowerShell v2 solution replaces. It’s also important to know that only the user that exported the file can import it. This is great from a security standpoint, but it gets tricky if you are using the exported credentials for scheduled tasks. If that’s the case you’ll need to log in as (or at least run PowerShell as) the service account and export the file that way.
Wrapping It Up
Muuuuch better. We didn’t have to force PowerShell to do anything it doesn’t want to do. Now, no matter what access a bad guy has to your server, short of a key logger, they have no way of figuring out your password. Now, if they have that file, and they know what it is and what account it’s for they can use it to do stuff as that account. So you still need to keep your scripts and this password file secure. This can be used for good though, too. Now you can write scripts that run as a specific account without the person running that script needing to know what the password is, or being able to discover it. This is great for people building SharePoint farms, or support personnel.
I’d like to apologize for publishing PowerShell scripts that might encourage bad behavior. Please forgive me. In the future I’ll try to use this more secure method for baking passwords in. Hopefully you can also use this technique to make your environments more secure too.
I would also like to give a hearty “Thanks” to Lori Gowin (Blog | Twitter) and Mike Robbins (Blog | Twitter). They both very graciously read through this blog post multiple times and offered several valuable suggestions. It sucks way less because of their input. Thanks again.
Every once in a while I get to add a little flair to a project I’m working on. Recently I was working on a couple of projects that intersected, sort of. First, I’ve been writing some scripts to automate some processes we have. These scripts do some pretty good logging to the file system in case there are problems. The average person would have stopped there, but not me. I wanted to take it a step farther. I added a bit where the script uploads the log files to a SharePoint document library. This makes them easier to get to for support personnel, and it makes it easier to search through them for specific issues. SharePoint saves the day again.
The other project I’ve working on is making my Netcast production more automated. Part of that process was using PowerShell to edit the MP3 tags on my Netcast files. While I was pretty proud of that, the previous project made me realize I could take things one step further and have that same script go ahead and upload the MP3 file when it’s finished. One less thing for me to put off when I’m procrastinating. Hooray efficiency. Plus I get braggin’ rights. Score!
On the surface, these two things sound like they’re the same thing, uploading files to SharePoint. Once you get into the weeds though, they’re actually different. In the first case I’m uploading a file to a local SharePoint server. This is pretty simple. While PowerShell doesn’t have a Upload-SPFile cmdlet we’re pretty close to it. Easy peasy. In the second case I’m uploading the files to a remote SharePoint server. Since it’s a remote server we can’t just add the SharePoint PowerShell module and use the same techniques as we would with a local server. Subtle differences, but important differences. As I was searching for “Upload files to SharePoint with PowerShell” I found most articles covered one or the other. Which is very handy if your situation matches the article’s. Not so handy if they don’t. So I wrote this blog post to cover both scenarios.
Scenario 1: Uploading Files to SharePoint on the SharePoint Server
Here’s a quick example of how to upload a document on a SharePoint server using the SharePoint PowerShell module which uses the SharePoint Object Model.
# Set the variables
$WebURL = “http://portal.contoso.com/sites/stuff”
$DocLibName = “Docs”
$FilePath = “C:\Docs\stuff\Secret Sauce.docx”
# Get a variable that points to the folder
$Web = Get-SPWeb $WebURL
$List = $Web.GetFolder($DocLibName)
$Files = $List.Files
# Get just the name of the file from the whole path
$FileName = $FilePath.Substring($FilePath.LastIndexOf("\")+1)
# Load the file into a variable
$File= Get-ChildItem $FilePath
# Upload it to SharePoint
$Files.Add($DocLibName +"/" + $FileName,$File.OpenRead(),$false)
In the case we use the Add member of the SPFileCollection class. It has a few overloads, so check them out, there might be one that better fits what you’re trying to do.
Scenario 2: Uploading Files to SharePoint from a Remote Machine
Since we can’t use the object model to upload files remotely we have to go about it a different way. I use the WebClient object, though there might be other ways. Here’s an example:
# Set the variables
$destination = "http://portal.contoso.com/sites/stuff/Docs”
$File = get-childitem “C:\Docs\stuff\Secret Sauce.docx”
# Since we’re doing this remotely, we need to authenticate
$securePasssword = ConvertTo-SecureString "pass@word1" -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential ("contoso\johnsmith", $securePasssword)
# Upload the file
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = $credentials
$webclient.UploadFile($destination + "/" + $File.Name, "PUT", $File.FullName)
Like the SPFileCollection class’ Add member, the UploadFile member of the WebClient class has a few overloads to consider. Check them out so you know what your options are.
PowerShell is cool. SharePoint is cool. Uploading files is cool. It just makes sense to use PowerShell to upload files to SharePoint. Hopefully this blog post covers all the scenarios you might encounter.
Edit 4/8/2014 – 1,000 apologies. The code in Scenario 2 didn’t work. I should have checked it better. It’s all good now.
This morning Microsoft updated the KB article for SharePoint Service Pack 1 with this notice:
We have recently uncovered an issue with this Service Pack 1 package that may prevent customers who have Service Pack 1 from deploying future public or cumulative updates. As a precautionary measure, we have deactivated the download page until a new package is published.
If you haven’t installed this in your Production environment yet, please hold off. If you have it in a Test or Dev environment go ahead and keep testing it. I’ll update this blog post as I get more information.
Bill Baer (he's a big deal at Microsoft) has stated that the MSDN ISO that has SP1 included is not impacted by this issue.
To keep up on all the SharePoint 2013 patch happenings you can check out my SharePoint 2013 Builds page. You can also follow my SP2013Patches Twitter account where I tweet out SharePoint 2013 patch related information.
FAQs (added 4/7/2014)
Q1) I was going to install SharePoint 2013 in a new farm with Service Pack 1 in a week (a day, 17 minutes, etc). This seems scary, should I still do it?
A2) First, breathe, it's gonna be okay. :) If I were installing a new farm in the next couple of days I would not install it with Service Pack 1. I would either install the farm with the March 2013 Public Update, or I'd wait a few days to see what Microsoft says about how to fix existing farms with Service Pack 1.
Q2) But, but, but I already have Service Pack 1 installed in my Production farm. Woe is me! Am I screwed? Am I going to have to quit SharePoint and become a Notes administrator? My family will be so ashamed!
A2) I would, never, ever recommend anyone take drastic action like becoming a Notes administrator. That's the kind of shame that doesn't wash off. If you currently have a Production farm with Service Pack 1 on it you're fine. Microsoft will fix this. They promise, and I believe them. I know, I know, "patching the patch that makes it so you can't install another patch" is pretty funny to think about, but I'm sure they can pull it off.
Q3) What if I have Service Pack 1 in a Test farm? Can it infect my Production farm?
A3) Test farms are fine. If you're currently testing Service Pack 1 in a Test farm, keep on keepin' on. When the Service Pack 1 fix comes out drop it into your Test farm and see what happens. I would still plan on putting Service Pack 1 on your Production farm eventually.
Q4) I installed a new SharePoint 2013 farm using the MSDN ISO that had Service Pack 1 baked in. Am I in trouble, too?
A4) No, you're fine. Bill Baer told me that this issue only affects farms that were patched to Service Pack 1. Farms that were installed with the MSDN ISO are not affected. If you used an RTM ISO and slipstreamed Service Pack 1 in you are affected. But like I said in A2, you'll be fine.
Edit: Added piece about the MSDN ISO
Edit (4/7/2014): Added the FAQs
Today was the first day of Microsoft’s Build conference and it was busy. They announced a bunch of new products. Some available soon, some available not so soon. One of the most exciting things coming out soon is the Update to Windows 8.1. It’s already available on MSDN, and it will trickle out as a series of patches next week on Patch Tuesday. Being the impatient guy that I am, I downloaded it and installed it today. In this blog post I’ll talk about some of the install particulars and I’ll also cover some of the new features.
If you have an MSDN subscription you can go out there now and download the Update today. There are three downloads, one for x86, and one for x64, and one for ARM. Grab whichever ones are appropriate for your existing Windows 8.1 devices. The x64 version will also work for any Windows 2012 R2 servers you have laying around.
When you download the package it’s a zip file containing six Windows patches and a readme file. The readme file provides some guidance on which order you’ll need to install the patches. Don’t be surprised if you already have any of the patches. Every machine of mine that I patched today already had KB2919442. The KB2919355 patch is 700 MB and seems to be the bulk of the update. I had to reboot after installing each patch, so be prepared for that.
If you don’t have an MSDN account, or you’re just more patient than I am, then you’ll get all these patches as part of the regular Windows Update process. So make sure you have Windows set to download and install new patches as they come out.
There are a ton of new features in the Update. I’m not going to be able to cover them all in this post. When you get done here, check out Paul Thurrott’s review. He covers a bunch of things I don’t.
The big focus on this Update, much like the update to Window 8.1 is making things better for people using mice and on desktop PCs. Several features help that out. Probably the most notable is that there is now a Search button, and sometimes a Power button in the upper right corner of the Start Screen, next to the user’s name.
Both of these functions were already available from the Charms bar, but that can be tough to coax out with a mouse and not everybody knows about the Win + C hotkey. Also, if you’re accessing the machine through remote control software, or virtual machine software, it just might not be possible. Once you have the Update installed you’ll be able to hit the Start Button, then either the Power or Search buttons. Oddly, the Power button does not show up on tablets. It only shows up on Desktop PCs and laptops. Paul goes into it more in his article, but Microsoft has decided the Power button wasn’t a good fit for devices they consider slates. The Search button simply brings out the Search bar. Both Search and Power work exactly the same from the buttons as they would if you fired them up from the Charms bar.
Another nod to Desktop users can be found in the PC Settings area. While Microsoft has been diligent about adding more and more settings in the Metro Change PC Settings pages, there always seems to be one setting that’s just not there. Now there’s a “control panel” link at the bottom that takes you to the Desktop Control Panel. If you can’t find it there, it can’t be found.
While we’re talking about PC Settings, another one of our prayers has been answered. We can finally remove wireless networks. In the Networks page click Manage Networks to get a list of the all the wireless networks your machine has connected to. Click one to remove it.
Metro apps coexist with the Desktop a little better with the Update. It’s now possible to pin Metro apps to the Taskbar, and the Update pins the Microsoft Store for you to get you started. Metro apps also have a title bar that drops down when you hover near the top of the screen. This title bar has minimize and close buttons, like we’re used to seeing in Desktop apps.
Microsoft has also made it marginally easier to locate new applications after you’ve installed them. After an application has been installed there will be a reminder in the lower right corner of the Start Screen. If you go to the Applications view all newly installed applications will be highlighted. While this isn’t a homerun, by any means, it is a step in the right direction.
The update wasn’t aimed solely at Desktop PCs, tablets got some love too. Namely, Microsoft wants to expand its market share in the tablet space in the worst way. Today at Build they announced that there will be no licensing fees for Windows devices with screens smaller than 9”. I expect to see a flood of devices with 8.999999” screens any day. Along with that, the 8.1 Update includes better support for machines with limited RAM and small amounts of storage. With this Update Windows 8.1 will support running on devices with as little as 1 GB of RAM, and 16 GB of storage. It does this by trimming the OS down, and by running it out of a compressed WIM file. This feature requires an SSD and will only be available for new devices. When I upgraded my Dell Venue 8 Pro it was not able to take advantage of this. I think this is a step in the right direction. I feel part of the reason Windows 8 tablets never took off was because Microsoft strictly controlled the hardware it could go on, and those hardware specs were pretty tight. They wanted to make sure everyone had a good experience, but I think it bit them. I think the combination of free licensing, and better support for low cost hardware will result in us seeing a lot more Windows devices in the wild.
So go out there and install the Update. Let me know in the Comments section how it went for you.
With the release of Windows 8.1, and soon the Update to Windows 8.1 now is as good a time as any to go ahead and ditch Window 7, or heaven forbid Windows XP, and embrace Windows 8 with both arms wide open. When Windows 8 came out, it got some negative press, some of which was even earned. In this article I’m going to give my top
ten 11 tips on how to make Windows 8 the daily driver on your desktop PC without pulling your hair out, or using Satya Nadella’s name in vain.
1) Update to Windows 8.1, then Windows 8.1 Update
I almost feel silly saying this, but keep your OS up to date. Windows 8.1 came out several months ago and took some huge strides in making Windows 8 better for desktop PCs. Unfortunately Microsoft didn’t do a good job promoting it, or making it easy for the average user to stumble across. It’s almost like it’s a prize at the end of a treasure hunt. It’s a free upgrade, so there’s no reason not to install it. And for my readers that say, “We always wait until Service Pack 1,” well, wait no more, this IS Service Pack 1. Besides, a bunch of the following tips will require Windows 8.1, so go ahead and install it. Once you do, you’ll be the envy of all your friends in your Wednesday night bowling league. I promise.
Now that I’ve convinced you to install it you’re probably wondering how to install it. That gets a little tricky. You get Windows 8.1 from the Microsoft Store. So if you don’t go there, you’ll never see it. You can get there by hitting the Store icon on the Start Screen, or going to the Start Screen and just typing “Store.” If you don’t see it right away when you go to the Store it might be because you haven’t installed all the Windows Patches needed. Go back to the Start Screen and type “update” and install the Windows Updates. All of them. You will probably get to reboot a few times, so make sure you have a good book handy. Then go back to the store and hopefully Windows 8.1 will be waiting for you.
The Windows 8.1 download is huge. It’s over 3 GB. That’s like a whole season of House of Cards and some Scooby Doo cartoons on Netflix. Make sure to give it some time to run in the background. While you’re waiting, you can read up on what’s new in Windows 8.1. You can also buy the Windows 8.1 Field Guide from Paul Thurrott.
2) Boot To Desktop
One of the many desktop friendly changes that came with Windows 8.1 was the ability to boot directly to the Desktop. You know, how we’re used to Windows booting for the last 20 years or so. When Windows 8 came out it debuted the infamous Start Screen. Which is absolutely fabulous on things with a touch screen, but absolutely dismal on things without. In Windows 8 there was no way around the Start Screen. Every time your machine powered on you had to click the Desktop tile on the Start Screen to get to the Desktop. In Windows 8.1 they added the glorious “Boot to Desktop” option. To activate it right click on the Taskbar (after you’ve clicked that blasted Desktop tile one final, satisfying time) and click Properties. In the Properties box click the Navigation tab. Check the box next to go to desktop, then click Ok.
While you’re in that page read over the other options. There are some other good ones in there like “Show my desktop background on Start” and my favorite, the one that replaces the crusty old Command Prompt with sleek, sexy PowerShell.
3) Expand Taskbar Items
While you’re in the Taskbar properties go ahead and change another one of my favorite settings, Taskbar buttons. This setting lets you control how large the taskbar buttons are. By default it is set to “Always combine, hide labels.” This means the taskbar buttons will always be small, regardless of how much empty space the Taskbar has. That’s just wasteful! I much prefer the “Combine when taskbar is full” setting. If you’re using a desktop PC you probably have decent sized monitors and plenty of space on your taskbar. No reason to not take advantage of that space. It also makes them easier to click with a mouse, as they are a larger target.
As a bonus, this setting works on Windows 8 and Windows 7 too.
4) Only use Desktop Internet Explorer
With Windows 8 the emphasis was very clearly touch devices, which is great for touch devices. Not so great for non-touch devices. One instance of this was with Internet Explorer. For maximum confusion and frustration, Windows 8/8.1 comes with two separate versions of Internet Explorer. One is the Desktop version we’ve been using since Alta Vista was the search engine of choice. The second version, we’ll call it Metro IE, is optimized for the touch experience. The problem is depending how a web page is opened, you might get Desktop IE or Metro IE. If you’re on a Desktop PC, Metro IE es no bueno.
Fortunately there’s a way to control this behavior and set it so your web pages always open up in Desktop IE. Open up Desktop IE and click the settings cog in the upper right, then click “Internet options.” The setting we’re looking for is at the top of the Programs tab. Select “Always in Internet Explorer on the desktop.”
After you change that, no matter how you stumble on that next link of glorious hysterical cat videos, it will open in Desktop IE.
5) Install Desktop Skype
Along those same lines, the version of Skype that comes with Windows 8/8.1 is a Metro app. And while it works okay in a touch environment, it’s very painful in a Desktop environment. It’s clumsy and it takes up too much screen space. And I’m pretty sure it ate the last Funyuns, then put the empty bag back in the cupboard. There’s good news though, you can install the Desktop version of Skype and get back to how Skype should be. Just download the desktop client and install it. Go ahead and pin it to your Start Screen. Make sure you pin “Skype for desktop” not just “Skype” which is the disappointing Metro version.
6) Type on the Start Page
One of the big problems with the new Metro interface is that it’s tough to discover things. You can’t just click or right click around and find them. One of Windows 8’s hidden gems is that when you’re on the Start Screen, you can just start typing and Windows will automatically start searching for you. Can’t find a program you installed? Just start typing. Looking for a particular setting? Just start typing. Looking for that picture of the baby throwing up on Grandpa? Just start typing. It’s pretty handy once you get used to using it.
7) Scroll Down for Apps
This is another thing that was improved in Windows 8.1, the ability to find apps that aren’t pinned on the Start Screen. Once Windows 8.1 is installed we get a handy down arrow in the lower left corner of the Start Screen. When it’s clicked it shows us all the applications installed on the machine. There are a variety of ways to sort and filter the apps, depending on what you’re looking for.
If you still can’t find what you’re looking for, you can use the old “just start typing” trick we talked about above. By default Search has the focus, so if you just can’t find that new version of Mahjongg you installed, you can type “mah” and it should pop right up.
8) Right Click on the Start Button for more Goodies
The most celebrated feature added in Windows 8.1 was the return of the Start Button. That alone is great for us Desktop users and cause for much celebration. It makes it a lot easier to get to the Start Screen, especially if it’s in a VM or RDP window. Along with having the glorious Start Button Microsoft stuffed a whole bunch of shortcuts into the context menu of the Start Button. Go ahead, right click on it and see what’s there.
And if right-clicking isn’t your thing, you can hit the Win+X shortcut key to get to it too. Here’s a full list of the rest of the Windows 8 Keyboard shortcuts. There’s some gold in them there hills.
9) Install Modern Mix
On a slate, full screen, finger friendly Metro apps work well. On a 24” monitor it seems a bit unnecessary for Solitaire to get the whole 24 inches. And splitting the screen with the Desktop doesn’t cut it either. Unfortunately there’s no way out of the box to run Metro apps anything but full screen or split screen. Some apps, like Skype and IE have both Metro and Desktop versions, but most don’t. We must have all been really good, and eaten our vegetables as children, because there’s a thing called Modern Mix that addresses this need. For a measly $5 you can run Metro apps inside of windows on the Desktop. And if the $5 price tag wasn’t enough for you to just buy it sight unseen it has a free 30 day trial. That’s more than enough time for you to fall in love with it.
10) Pin Metro Apps to the Taskbar
With Modern Mix, or the soon to be released (as of March 2014) Update to Windows 8.1, it will be possible to pin Metro apps to the Desktop’s Taskbar. This gives you quick access to some of your favorite Metro apps. When you install the Update it automatically pins the Store app there to get you started.
11) Make Good Use of Multiple Monitors
These days it seems you’re just not cool unless you have multiple monitors. I know I wasn’t cool until I did. Traditionally Windows hasn’t done a great job handling that. In the past I’ve had to buy 3rd party software to manage them the way that I want to. Windows 8 is the first Windows where that hasn’t been necessary. If Windows detects multiple monitors it lights up some configuration for them, including my favorite, which puts the buttons for programs only on the Taskbar of the monitor where they are running.
When Windows first started really supporting multiple monitors well (Vista, maybe?) the taskbar started on your main monitor and the programs were just in the order that you opened them. It was possible to click a program in the Taskbar on monitor 1, but have the program itself pop up in monitor 2 or 3. Highly annoying. You can still have this behavior in Windows 8, if you like to be annoyed, but you can also tell Windows to put the program’s button in the taskbar of the monitor where it’s really at. 3 out of 4 dentists agree that is better.
When Windows 8 came out it was much maligned by people not using slates, and rightfully so. Microsoft heard our pleas though, and they’ve addressed a lot of those issues. If you haven’t already taken Windows 8 for a spin, now is a great time. Using these 11 tips will ensure that your experience is at least 26% better. That’s just science.
Sometimes I feel like I’m a little slow picking things up, kind of like the kid at the back of the class eating paste. Today is one of those days. As I’ve talked about in my Netcasts, I use OneNote a lot. Every day. I’d be miserable without it. I’d give up sliced bread before I gave up OneNote. One of my biggest complaints is that there is no automated way to sort the pages (the things along the right hand side), either alphabetically or numerically. Over the years I’ve kept sections (the things across the top) for customers, projects, and Netcasts. All things that benefit greatly from having the pages (still on the right) in a predictable order. For years I’ve clicked “Add Page” at the top of the pages column, which puts my shiny new page allllll the way at the bottom of the pages. Then, like a punk, I drag it up to wherever I want. It’s pretty inefficient and it always makes me feel rotten about myself.
And then today happened.
I was in OneNote, like I always am, and I noticed this little gem:
Being the curious, and not very smart, sort, I clicked it to see what would happen. What happened was marvelous! Miraculous! Super seriously cool! It created a page, right there!!!! You read that right, right there! No more dragging the page up from the deep depths of the page list. I didn’t think it was possible, but I think I love OneNote even more today than I did yesterday.
If you haven’t already seen, OneNote is free. And you can Email your notes into OneNote with email@example.com. And I also heard that it was OneNote that invented magnets, and just gave the world that technology. True story.
|There are currently no upcoming events.