<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Steve Lineberry</title>
	<atom:link href="https://steve.thelineberrys.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://steve.thelineberrys.com</link>
	<description>SharePoint Guru, Technology Geek, Outdoor Enthusiast, Etc.</description>
	<lastBuildDate>Wed, 18 May 2016 15:18:05 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">47679680</site>	<item>
		<title>Mixing Mobile Friendly Forms based auth with NTLM Windows auth in SharePoint</title>
		<link>https://steve.thelineberrys.com/mixing-friendly-forms-based-auth-with-ntlm-windows-auth-in-sharepoint/</link>
					<comments>https://steve.thelineberrys.com/mixing-friendly-forms-based-auth-with-ntlm-windows-auth-in-sharepoint/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Thu, 25 Feb 2016 17:16:54 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[SharePoint 2013]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=645</guid>

					<description><![CDATA[One of the complaints I hear often is when users on mobile devices, mainly iOS, attempt to login to SharePoint.  Typically they are presented with a popup box asking for their username and password but there isn&#8217;t an option to <a class="more-link" href="https://steve.thelineberrys.com/mixing-friendly-forms-based-auth-with-ntlm-windows-auth-in-sharepoint/">Continue reading <span class="screen-reader-text">  Mixing Mobile Friendly Forms based auth with NTLM Windows auth in SharePoint</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>One of the complaints I hear often is when users on mobile devices, mainly iOS, attempt to login to SharePoint.  Typically they are presented with a popup box asking for their username and password but there isn&#8217;t an option to save the password.  This is because our SharePoint web applications are using NTLM windows authentication because this is the most compatible with desktop PCs and provides the most functionality in SharePoint.  Apple is decidedly &#8220;<a href="http://www.urbandictionary.com/define.php?term=Nerfing" target="_blank">nerfing</a>&#8221; their safari browser to force more apps to be sold which makes them more money.  Part of this is them not providing an option to save passwords for NTLM authenticated sites and thus requiring apps to be made to support browsing SharePoint.</p>
<p>I&#8217;ve been working on this problem for a while.  Because of BI and some other features we couldn&#8217;t move away from Windows authentication for SharePoint.  So last year a coworker and I worked on creating our own browser app in iOS which would save user&#8217;s credentials and allow access to our SharePoint sites.  The problem with this approach is now we are developing a commodity, a web browser, which could end up taking a lot of time and effort for not much benefit.  After a long year last year working on many projects I got some breathing room at the beginning of this year and my brain decided to work on this problem and I came up with an idea.</p>
<p>Since I know SharePoint takes a windows principal and converts it into a windows claim, what if I could inject myself right BEFORE it converts the principal into a claim and replace the principal with a user of my choice.  I reflectored the code in Microsoft.SharePoint.IdentityModel.SPWindowsClaimsAuthenticationHttpModule and found the right spot and after building my own httpmodule and configuring it to run before SharePoint&#8217;s (see web.config example below), I was able to change the currently logged in user to be one of my choice.  This was great because this meant that I could potentially create a forms based experience for mobile devices and then tell SharePoint to use that user instead of thinking we weren&#8217;t authenticated.  The reason forms based authentication is needed is because iOS supports remembering passwords for forms based authentication.</p>
<p><strong>SharePoint web.config</strong></p>
<pre class="brush: xml; gutter: true">&lt;system.webServer&gt;
...
 &lt;modules runAllManagedModulesForAllRequests=&quot;true&quot;&gt;
 ...
 &lt;add name=&quot;WindowsFormLogin&quot; preCondition=&quot;integratedMode&quot; type=&quot;SharePoint.HttpModules.WindowsFormLogin, SharePoint.HttpModules, Version=1.0.0.0, Culture=neutral, PublicKeyToken=***********&quot; /&gt;
 &lt;add name=&quot;SPWindowsClaimsAuthentication&quot; type=&quot;Microsoft.SharePoint.IdentityModel.SPWindowsClaimsAuthenticationHttpModule, Microsoft.SharePoint.IdentityModel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot; /&gt;
 ...
 &lt;/modules&gt;
...
&lt;/system.webServer&gt;</pre>
<p>Notice in the httpmodule below that I am checking to see if the useragent of the device is a mobile device on line 21.  Then I am checking if the status being returned is a 401 (unauthorized) on line 39.  Originally those were the only rules I had in place before I redirected to my forms login page.  But then I ran into some issues with the SharePlus app, which uses the same useragent as safari, trying to use webservices and requesting files and it didn&#8217;t understand our new authentication.  So i placed some other checks in there to determine whether it was a request from a browser or from an app.  Apps never have referrers set, so I check that first (line 59), and then I have a few other checks in place including looking at the querystring for web=1 (line 69) which is what SP uses to open files in the office web apps (office online).  So if i think this request is coming from a mobile device and it&#8217;s not an app, then I redirect to my special login page (line 85), otherwise I add some headers (line 90) which may not be needed but potentially apps such as office might be interested in.</p>
<p><strong>HttpModule &#8211; PreSendRequestHeaders</strong></p>
<div class="syntaxhighlighterFixedHeight">
<pre class="brush: csharp; gutter: true">public class WindowsFormLogin : IHttpModule
{
	public void Init(HttpApplication context)
	{
		if (context == null)
		{
			return;
		}
		context.AuthenticateRequest += context_AuthenticateRequest;
		context.PreSendRequestHeaders += context_PreSendRequestHeaders;
	}

	void context_PreSendRequestHeaders(object sender, EventArgs e)
	{
		HttpApplication httpApplication = sender as HttpApplication;
		HttpContext context = httpApplication.Context;

		if (context == null) return;
		if (context.Request == null) return;
		if (context.Request.Browser == null) return;
		if (false == context.Request.Browser.IsMobileDevice) return;
		

		if (context.Request.Cookies[Constants.MOBILE_LOGIN_EXCLUDE_COOKIE_NAME] != null)
		{
			string cookieValue = context.Request.Cookies[Constants.MOBILE_LOGIN_EXCLUDE_COOKIE_NAME].Value;
			bool exclude;
			if (false == bool.TryParse(cookieValue, out exclude))
			{
				exclude = false;
			}

			if (exclude) return;
		}

		string userAgent = context.Request.ServerVariables[&quot;HTTP_USER_AGENT&quot;];
		if (userAgent.Contains(&quot;AppleWebKit&quot;) &amp;&amp;
		    false == userAgent.Contains(&quot;Safari&quot;)) return;

		int status = context.Response.StatusCode;
		switch (status)
		{
			case 401:
				if (IsPageRequest(context))
		                    {
		                        HandlePageRequest(context);
		                    }
		                    else
		                    {
		                        HandleNonPageRequest(context);
		                    }
				
				break;
		}
	}

private bool IsPageRequest(HttpContext context)
        {
            if (context.Request.Url == null) return false;
            if (string.IsNullOrEmpty(context.Request.Url.AbsolutePath)) return false;

            if (context.Request.UrlReferrer != null &amp;&amp;
                false == string.IsNullOrEmpty(context.Request.UrlReferrer.ToString()))
            {
                return true;
            }

            if (context.Request.Url.AbsolutePath.ToLower().EndsWith(&quot;.aspx&quot;)) return true;
            if (context.Request.Url.AbsolutePath.Contains(&quot;/_layouts/&quot;)) return true;
            if (context.Request.Url.AbsolutePath.Contains(&quot;/_&quot;)) return false;

            if (context.Request.QueryString[&quot;web&quot;] != null &amp;&amp;
                context.Request.QueryString[&quot;web&quot;] == &quot;1&quot;)
            {
                return true;
            }

            try
            {
                if (SPContext.Current.Web.ServerRelativeUrl.ToLower() == context.Request.Url.AbsolutePath.ToLower()) return true;
            }
            catch { }

            return false;
        }

        private void HandlePageRequest(HttpContext context)
        {
            context.Response.Redirect(&quot;/_mobilelogin/Home/Login?ReturnUrl=&quot; + HttpUtility.UrlEncode(context.Request.Url.ToString()));
        }

        private void HandleNonPageRequest(HttpContext context)
        {
            if (context.Response.Headers[&quot;X-Forms_Based_Auth_Required&quot;] == null)
            {
                context.Response.Headers.Add(&quot;X-Forms_Based_Auth_Required&quot;, &quot;/_mobilelogin/Home/Login?ReturnUrl=&quot; + HttpUtility.UrlEncode(context.Request.Url.ToString()));
            }
            if (context.Response.Headers[&quot;X-Forms_Based_Auth_Return_Url&quot;] == null)
            {
                Uri relativeUri;
                Uri.TryCreate(&quot;/&quot; + SPUtility.ContextLayoutsFolder + &quot;/error.aspx&quot;, UriKind.Relative, out relativeUri);
                string absoluteUri2 = new Uri(SPAlternateUrl.ContextUri, relativeUri).AbsoluteUri;
                context.Response.Headers.Add(&quot;X-Forms_Based_Auth_Return_Url&quot;, absoluteUri2);
            }

            if (context.Response.Headers[&quot;X-MSDAVEXT_Error&quot;] == null)
            {
                string value = &quot;917656; &quot; + HttpUtility.HtmlAttributeEncode(SPResource.GetString(&quot;FormsAuthenticationNotBrowser&quot;, new object[0]));
                context.Response.Headers.Add(&quot;X-MSDAVEXT_Error&quot;, value);
            }
        }


}</pre>
</div>
<p>I decided to create a ASP.NET MVC web application for my login page.  For things to work as expected, this needs to be hosted in your SharePoint farm.  I decided to add it as a virtual directory called _mobilelogin in IIS under my SharePoint web applications.  Because I need a windows principal object later, I need to store the person&#8217;s username and password somewhere I can get to it later.  There are a few different ways of handling this, each with their own pros and cons but to keep things simple for this blog post, I will use the FormsAuthenticationTicket (line 70) that normal ASP.NET Forms based authentication uses to store both the userid and password.  This ticket gets encrypted (line 78) and stored as a cookie in the browser of the mobile device (line 84).  Since the password is sensitive, it will be doubly encrypted because it gets encrypted once (line 75) and then put into the ticket which gets encrypted again.</p>
<div class="syntaxhighlighterFixedHeight">
<p><strong>MVC Model and Controller</strong></p>
<pre class="brush: csharp; gutter: true">public class LoginModel
{
	public string UserName { get; set; }
	public string Password { get; set; }
	public bool CookieSet { get; set; }
	public bool RememberMe { get; set; }
}
	
public class HomeController : Controller
{
	[HttpGet]
	[OutputCache(NoStore = true, Duration = 0, VaryByParam = &quot;None&quot;)] 
	public ActionResult Login()
	{
		LoginModel mdl = new LoginModel();
		mdl.RememberMe = true;
		try
		{
			if (Request.Cookies[Constants.MOBILE_LOGIN_COOKIE_NAME] != null)
			{

				string cookieValue = Request.Cookies[Constants.MOBILE_LOGIN_COOKIE_NAME].Value;

				if (false == string.IsNullOrEmpty(cookieValue))
				{
					FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookieValue);
					if (ticket.Expired)
					{
						Utility.LogoutHelper(Response);
					}
					else
					{
						mdl.UserName = ticket.Name;
						mdl.CookieSet = true;
					}
				}
			}
		}
		catch (Exception e)
		{
			ViewBag.ErrorMsg = e.Message;
		}

		return View(mdl);
	}

	[HttpPost]
	[OutputCache(NoStore = true, Duration = 0, VaryByParam = &quot;None&quot;)] 
	public ActionResult Login(LoginModel mdl)
	{
		try
		{
			if (false == string.IsNullOrEmpty(mdl.UserName) &amp;&amp;
				false == string.IsNullOrEmpty(mdl.Password))
			{
				string username = mdl.UserName;
				if (false == Utility.IsAnEmailAddress(username) &amp;&amp;
					string.IsNullOrEmpty(Utility.ExtractDomain(username)))
				{
					username = ConfigurationManager.AppSettings[&quot;DefaultDomain&quot;] + &quot;\\&quot; + username;
				}
				WindowsIdentity identity = Utility.Logon(username, mdl.Password);

				DateTime expiration = DateTime.Now.AddMinutes(Constants.MOBILE_LOGIN_TTL_SHORT_MIN);
				if (mdl.RememberMe)
				{
					expiration = DateTime.Now.AddDays(Constants.MOBILE_LOGIN_TTL_LONG_DAYS);
				}

				FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
					username,
					DateTime.Now,
					expiration,
					mdl.RememberMe,
					Utility.Protect(mdl.Password, Constants.MOBILE_LOGIN_SALT),
					FormsAuthentication.FormsCookiePath);

				HttpCookie cookie = new HttpCookie(Constants.MOBILE_LOGIN_COOKIE_NAME, FormsAuthentication.Encrypt(ticket));
				if (mdl.RememberMe)
				{
					cookie.Expires = ticket.Expiration;
				}
				Utility.SetAttributes(cookie);
				Response.Cookies.Add(cookie);

				HttpCookie cookieExclude = new HttpCookie(Constants.MOBILE_LOGIN_EXCLUDE_COOKIE_NAME, false.ToString());
				Utility.SetAttributes(cookieExclude);
				cookieExclude.Expires = DateTime.Now.AddDays(-1);
				Response.Cookies.Add(cookieExclude);
				
				Redirect();
			}
			else
			{
				ViewBag.ErrorMsg = &quot;Please fill in both the UserName and Password fields.&quot;;
			}
		}
		catch (Exception e)
		{
			ViewBag.ErrorMsg = e.Message;
		}

		return View(mdl);
	}

	public ActionResult Logout()
	{
		Utility.LogoutHelper(Response);

		return View();
	}

	[OutputCache(NoStore = true, Duration = 0, VaryByParam = &quot;None&quot;)] 
	public ActionResult Exclude()
	{
		HttpCookie cookieExclude = new HttpCookie(Constants.MOBILE_LOGIN_EXCLUDE_COOKIE_NAME, true.ToString());
		Utility.SetAttributes(cookieExclude);
		Response.Cookies.Add(cookieExclude);

		Utility.LogoutHelper(Response);
		Redirect();

		return View();
	}

	private void Redirect()
	{
		string returnUrl = &quot;/&quot;;
		if (false == string.IsNullOrEmpty(Request.QueryString[&quot;ReturnUrl&quot;]))
		{
			returnUrl = HttpUtility.UrlDecode(Request.QueryString[&quot;ReturnUrl&quot;]);
		}

		Response.Redirect(returnUrl);
	}
}</pre>
<p><strong>MVC View</strong></p>
<pre class="brush: html; gutter: true">@model LoginModel

@{
    ViewBag.Title = &quot;Login&quot;;
}


&lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;row&quot;&gt;
        &lt;div class=&quot;col-sm-12&quot;&gt;
            @using (Html.BeginForm())
            {
                &lt;div class=&quot;form-horizontal&quot; style=&quot;margin-top:90px;width:90%&quot;&gt;
                    &lt;div class=&quot;form-group&quot;&gt;
                        &lt;div class=&quot;col-md-offset-3 col-sm-9&quot;&gt;
                            &lt;h4&gt;This is a special login page just for mobile devices.  If you feel you reached this page in error, @Html.ActionLink(&quot;click here to restore normal login functionality&quot;, &quot;Exclude&quot;, &quot;Home&quot;).&lt;/h4&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;form-group&quot;&gt;
                        &lt;div class=&quot;col-md-offset-3 col-sm-9&quot;&gt;
                            @if (false == string.IsNullOrEmpty(ViewBag.ErrorMsg))
                            {
                                &lt;p class=&quot;error&quot;&gt;@ViewBag.ErrorMsg&lt;/p&gt;
                            }
                        &lt;/div&gt;
                    &lt;/div&gt;
                    @if (Model.CookieSet)
                    {
                        &lt;div class=&quot;form-group&quot;&gt;
                            &lt;div class=&quot;col-md-offset-3 col-sm-9&quot;&gt;
                                &lt;h4&gt;
                                    You are currently logged in as: @Model.UserName &lt;br /&gt;
                                    @Html.ActionLink(&quot;Click here to logout&quot;, &quot;Logout&quot;, &quot;Home&quot;, new { ReturnUrl = Request.QueryString[&quot;ReturnUrl&quot;] }, new { } ).
                                &lt;/h4&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                        &lt;div class=&quot;form-group&quot;&gt;
                            &lt;div class=&quot;col-md-offset-3 col-sm-9&quot;&gt;
                                &lt;h4&gt;
                                    @if (string.IsNullOrEmpty(Request.QueryString[&quot;ReturnUrl&quot;]))
                                    {
                                        &lt;a href=&quot;/&quot;&gt;Return to site&lt;/a&gt;
                                    }else{
                                        &lt;a href=&quot;@HttpUtility.UrlDecode(Request.QueryString[&quot;ReturnUrl&quot;])&quot;&gt;Return to site&lt;/a&gt;
                                    }
                                &lt;/h4&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    }
                    else
                    {
                    &lt;div class=&quot;form-group&quot;&gt;
                        @Html.Label(&quot;User Name&quot;, new { @class = &quot;col-sm-3 control-label&quot; })
                        &lt;div class=&quot;col-md-9&quot;&gt;
                            @Html.TextBoxFor(m =&gt; m.UserName, new { @class = &quot;form-control&quot; })
                            @Html.ValidationMessageFor(m =&gt; m.UserName, null, new { @class = &quot;help-inline&quot; })
                        &lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;form-group&quot;&gt;
                        @Html.LabelFor(m =&gt; m.Password, new { @class = &quot;col-sm-3 control-label&quot; })
                        &lt;div class=&quot;col-md-9&quot;&gt;
                            @Html.PasswordFor(m =&gt; m.Password, new { @class = &quot;form-control&quot; })
                            @Html.ValidationMessageFor(m =&gt; m.Password, null, new { @class = &quot;help-inline&quot; })
                        &lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;form-group&quot;&gt;
                        &lt;div class=&quot;col-md-offset-3 col-sm-9&quot;&gt;
                            &lt;input type=&quot;submit&quot; value=&quot;Log in&quot; class=&quot;btn btn-default&quot; /&gt;
                            @Html.Label(&quot;Remember Me&quot;)
                            @Html.CheckBoxFor(m =&gt; m.RememberMe, new { @checked = &quot;checked&quot; })
                        &lt;/div&gt;
                    &lt;/div&gt;
                    &lt;div class=&quot;form-group&quot;&gt;
                        &lt;div class=&quot;col-md-offset-3 col-sm-9&quot;&gt;
                            &lt;h4&gt;If you have previously saved your password in your browser, select the username field above and then select autofill password at the top of the onscreen keyboard.&lt;/h4&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    }
                    &lt;br /&gt;
                &lt;/div&gt;
            }
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;</pre>
</div>
<p>After we set the cookie in our MVC application, we need to redirect back to where we came from.  Then the HttpModule from earlier kicks in but on a different event: AuthenticateRequest.  Notice on line 26 where our Ticket gets unencrypted and I check to make sure it is still valid and not expired.  After that I get a WindowsIdentity object by logging in as the user with their username and password (line 33).  I then create a WindowsPrincipal object from the identity and assign it to the user property of the HttpContext (line 36).  This HttpContext.User property is what the SPWindowsClaimsAuthentication HttpModule will look at when creating the Windows Claim which SharePoint then uses everywhere.  I also hijack the signout page on line 38 to redirect to our forms logout page when we are logged in using our forms method.</p>
<p><strong>HttpModule &#8211; AuthenticateRequest</strong></p>
<div class="syntaxhighlighterFixedHeight">
<pre class="brush: csharp; gutter: true">public class WindowsFormLogin : IHttpModule
{
	public void Init(HttpApplication context)
	{
		if (context == null)
		{
			return;
		}
		context.AuthenticateRequest += context_AuthenticateRequest;
		context.PreSendRequestHeaders += context_PreSendRequestHeaders;
	}

	void context_AuthenticateRequest(object sender, EventArgs e)
	{
		HttpApplication httpApplication = sender as HttpApplication;
		HttpContext context = httpApplication.Context;

		try
		{
			if (context.Request.Cookies[Constants.MOBILE_LOGIN_COOKIE_NAME] == null) return;

			string cookieValue = context.Request.Cookies[Constants.MOBILE_LOGIN_COOKIE_NAME].Value;

			if (false == string.IsNullOrEmpty(cookieValue))
			{
				FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookieValue);
				if (ticket.Expired)
				{
					throw new ApplicationException(&quot;Mobile Login Expired&quot;);
				}

				string user = ticket.Name;
				WindowsIdentity identity = Utility.Logon(user, Utility.Unprotect(ticket.UserData, Constants.MOBILE_LOGIN_SALT));

				context.Request.ServerVariables[&quot;LOGON_USER&quot;] = user;
				context.User = new WindowsPrincipal(identity);

				int index = context.Request.RawUrl.ToLower().IndexOf(&quot;/_layouts/15/signout.aspx&quot;);
				if (index &gt;= 0)
				{
					string returnUrl = &quot;/&quot;;
					if (index &gt; 0)
					{
						returnUrl = context.Request.RawUrl.ToLower().Substring(0, index);
					}
					if (context.Request.UrlReferrer != null &amp;&amp;
						false == string.IsNullOrEmpty(context.Request.UrlReferrer.ToString()))
					{
						returnUrl = context.Request.UrlReferrer.ToString();
					}
					context.Response.Redirect(&quot;/_mobilelogin/Home/Logout?ReturnUrl=&quot; + HttpUtility.UrlEncode(returnUrl));
				}
			}
		}
		catch (Exception ex)
		{
			//MobileLogin Login Error
			Utility.LogoutHelper(context);
		}
	}
}</pre>
</div>
<p>I have used a few helper methods in my code above so below is this code which should enable you to put this solution together in your own environment.  Also, the MVC login app pool service account and your SharePoint app pool service account need special permissions on the server in order for them to login as another user on line 61.  This permission is called &#8220;Act as part of the operating system&#8221; which can be found in user rights assignment in local security policies.</p>
<p><strong>Utility Class</strong></p>
<div class="syntaxhighlighterFixedHeight">
<pre class="brush: csharp; gutter: true">public class Constants{
	public const string MOBILE_LOGIN_COOKIE_NAME = &quot;MobileLogin&quot;;
	public const string MOBILE_LOGIN_EXCLUDE_COOKIE_NAME = &quot;MobileLoginExcluded&quot;;
	public const int MOBILE_LOGIN_TTL_LONG_DAYS = 90;
	public const int MOBILE_LOGIN_TTL_SHORT_MIN = 90;
	public const string MOBILE_LOGIN_SALT = &quot;TEST 123&quot;;
}

public class Utility
{
	public static string Protect(string text, params string[] purpose)
	{
		if (string.IsNullOrEmpty(text))
			return null;

		byte[] stream = Encoding.UTF8.GetBytes(text);
		byte[] encodedValue = MachineKey.Protect(stream, purpose);
		return HttpServerUtility.UrlTokenEncode(encodedValue);
	}
	public static string Unprotect(string text, params string[] purpose)
	{
		if (string.IsNullOrEmpty(text))
			return null;

		byte[] stream = HttpServerUtility.UrlTokenDecode(text);
		byte[] decodedValue = MachineKey.Unprotect(stream, purpose);
		return Encoding.UTF8.GetString(decodedValue);
	}

	public static WindowsIdentity Logon(string username, string password)
	{
		string domain = Utility.ExtractDomain(username);
		username = Utility.ExtractName(username);

		IntPtr handle = new IntPtr(0);
		handle = IntPtr.Zero;

		const int LOGON32_LOGON_NETWORK = 3;
		const int LOGON32_PROVIDER_DEFAULT = 0;

		// attempt to authenticate domain user account
		bool logonSucceeded = LogonUser(username, domain, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ref handle);

		if (!logonSucceeded)
		{
			// if the logon failed, get the error code and throw an exception
			int errorCode = Marshal.GetLastWin32Error();
			throw new Exception(&quot;User logon failed. Error Number: &quot; + errorCode);
		}

		// if logon succeeds, create a WindowsIdentity instance
		WindowsIdentity winIdentity = new WindowsIdentity(handle, &quot;NTLM&quot;);

		// close the open handle to the authenticated account
		CloseHandle(handle);

		return winIdentity;
	}

	[DllImport(&quot;advapi32.dll&quot;, SetLastError = true)]
	private static extern bool LogonUser(string lpszUsername,
										string lpszDomain,
										string lpszPassword,
										int dwLogonType,
										int dwLogonProvider,
										ref IntPtr phToken);

	[DllImport(&quot;kernel32.dll&quot;, CharSet = CharSet.Auto)]
	private static extern bool CloseHandle(IntPtr handle);
	
	public static bool IsAnEmailAddress(string text)
	{
		if (text == null) return false;
		if (text.Length &lt;= 0) return false;
		if (text.IndexOf(&quot; &quot;) &gt;= 0) return false;

		string patternLenient = @&quot;\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&quot;;
		Regex reLenient = new Regex(patternLenient);
		string patternStrict = @&quot;^(([^&lt;&gt;()[\]\\.,;:\s@\&quot;&quot;]+&quot;
			+ @&quot;(\.[^&lt;&gt;()[\]\\.,;:\s@\&quot;&quot;]+)*)|(\&quot;&quot;.+\&quot;&quot;))@&quot;
			+ @&quot;((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}&quot;
			+ @&quot;\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+&quot;
			+ @&quot;[a-zA-Z]{2,}))$&quot;;
		Regex reStrict = new Regex(patternStrict);
		return reStrict.IsMatch(text);
	}

	public static string ExtractDomain(string UserName)
	{
		if (UserName.IndexOf(Convert.ToChar(&quot;\\&quot;)) &gt; 0)
		{
			string[] fullDomainUserName = UserName.Split(new char[] { &#039;\\&#039; }, 2);
			return fullDomainUserName[0];
		}
		else
		{
			return string.Empty;
		}
	}

	public static string ExtractName(string name)
	{
		if (name.IndexOf(Convert.ToChar(&quot;\\&quot;)) &gt; 0)
		{
			string[] fullDomainName = name.Split(new char[] { &#039;\\&#039; }, 2);
			return fullDomainName[fullDomainName.Length - 1];
		}
		else
		{
			return name;
		}
	}
	
	public static void SetAttributes(HttpCookie cookie, HttpContext context)
	{
		cookie.HttpOnly = true;
		string domain = GetRootCookieDomain(GetBasePath(context));
		if (false == string.IsNullOrEmpty(domain) &amp;&amp;
			domain.Contains(&#039;.&#039;))
		{
			cookie.Domain = domain;
		}
	}

	public static void LogoutHelper(HttpContext context)
	{
		try
		{
			HttpCookie cookie = new HttpCookie(Constants.MOBILE_LOGIN_COOKIE_NAME, string.Empty);
			cookie.Expires = DateTime.Now.AddDays(-1);
			SetAttributes(cookie, context);

			context.Response.Cookies.Add(cookie);
		}
		catch (Exception err)
		{
			//MobileLogin Logout Cookie Error
		}
	}
	
	public static string GetRootCookieDomain(string url)
	{
		url = GetBasePathFromUrl(url);
		if (string.IsNullOrEmpty(url)) return url;
		Uri uri = new Uri(url);
		string host = uri.Host;
		if (false == host.Contains(&#039;.&#039;)) return uri.Host;

		string[] hostParts = host.Split(&#039;.&#039;);
		string domain = &quot;.&quot; + hostParts[hostParts.Length - 2] + &quot;.&quot; + hostParts[hostParts.Length - 1];

		return domain;
	}
	
	public static string GetBasePathFromUrl(string url)
	{
		string newUrl = string.Empty;
		if (url.Contains(&quot;://&quot;))
		{
			newUrl = url.Substring(0, url.IndexOf(&quot;://&quot;) + 3);
			url = url.Substring(url.IndexOf(&quot;://&quot;) + 3, url.Length - url.IndexOf(&quot;://&quot;) - 3);
			if (url.Contains(&quot;/&quot;))
			{
				newUrl += url.Substring(0, url.IndexOf(&quot;/&quot;));
			}
			else
			{
				newUrl += url;
			}
		}
		return newUrl;
	}
	
	public static string GetBasePath(HttpContext context)
	{
		string basepath = &quot;&quot;;
		if (context.Request.ServerVariables[&quot;HTTPS&quot;].ToString().ToUpper().Equals(&quot;ON&quot;))
		{
			basepath = &quot;https://&quot;;
		}
		else
		{
			basepath = &quot;http://&quot;;
		}
		basepath += context.Request.ServerVariables[&quot;SERVER_NAME&quot;].ToString();
		if (!context.Request.ServerVariables[&quot;SERVER_PORT&quot;].ToString().Equals(&quot;80&quot;) &amp;&amp;
			!context.Request.ServerVariables[&quot;SERVER_PORT&quot;].ToString().Equals(&quot;443&quot;))
		{
			basepath += &quot;:&quot; + context.Request.ServerVariables[&quot;SERVER_PORT&quot;].ToString();
		}
		return basepath;
	}
}</pre>
</div>
<p><strong>Edit 05/18/2016:</strong></p>
<p>Added a useragent check before the 401 status check to help with apps like the SharePoint iOS app and SharePlus which already know how to connect to SharePoint using NTLM.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/mixing-friendly-forms-based-auth-with-ntlm-windows-auth-in-sharepoint/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">645</post-id>	</item>
		<item>
		<title>SharePoint Cross Site Word Document Properties</title>
		<link>https://steve.thelineberrys.com/sharepoint-cross-site-word-document-properties/</link>
					<comments>https://steve.thelineberrys.com/sharepoint-cross-site-word-document-properties/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Thu, 04 Feb 2016 19:06:23 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[SharePoint 2013]]></category>
		<category><![CDATA[MS Word]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=636</guid>

					<description><![CDATA[Recently I had a project where I was using SharePoint columns as document property fields in MS Word.  This is pretty straight forward when you have one library and some files but when you have a central repository of master files <a class="more-link" href="https://steve.thelineberrys.com/sharepoint-cross-site-word-document-properties/">Continue reading <span class="screen-reader-text">  SharePoint Cross Site Word Document Properties</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Recently I had a project where I was using SharePoint columns as document property fields in MS Word.  This is pretty straight forward when you have one library and some files but when you have a central repository of master files that are then pushed out to different sites across your farm it makes it a little more interesting.  We built our content types and columns in Visual Studio which were deployed on all sites and thus had the same contenttypeid&#8217;s and column guids.  One thing I noticed was that in the master library the document field would work correctly but once the file was copied to another site the document field would no longer work.  I was unable to find anything on the web about this scenario which is why I&#8217;m posting my findings here.</p>
<p>First thing I did was to open the copied file in one of the non-master sites and fix the field.  I just deleted the old one and re-added it and everything was fine.  Next I renamed both the fixed document and the master document to have a .zip extension.  This enables me to extract the contents of the word file so I could examine the differences.  What I found was that in the word\document.xml file where the document fields were inserted they had different GUIDs for the ns3 namespace attribute (see on line 21).  Also check out the xpath statement on line 23 and then notice how the namespace (ns3) for our document field (ProjectName) is the namespace where we have different GUIDs between the two documents.</p>
<pre class="brush: xml; gutter: true">&lt;w:sdt&gt;
	&lt;w:sdtPr&gt;
		&lt;w:rPr&gt;
			&lt;w:b/&gt;
			&lt;w:smallCaps/&gt;
			&lt;w:snapToGrid w:val=&quot;0&quot;/&gt;
			&lt;w:sz w:val=&quot;18&quot;/&gt;
		&lt;/w:rPr&gt;
		&lt;w:alias w:val=&quot;Project Name&quot;/&gt;
		&lt;w:tag w:val=&quot;ProjectName&quot;/&gt;
		&lt;w:id w:val=&quot;-1780325992&quot;/&gt;
		&lt;w:lock w:val=&quot;sdtContentLocked&quot;/&gt;
		&lt;w:placeholder&gt;
			&lt;w:docPart w:val=&quot;1BC5893A50C54E06B3DBC32132B17E14&quot;/&gt;
		&lt;/w:placeholder&gt;
		&lt;w:showingPlcHdr/&gt;
		&lt;w:dataBinding 
			w:prefixMappings=&quot;xmlns:ns0=&#039;http://schemas.microsoft.com/office/2006/metadata/properties&#039; 
			xmlns:ns1=&#039;http://www.w3.org/2001/XMLSchema-instance&#039; 
			xmlns:ns2=&#039;http://schemas.microsoft.com/office/infopath/2007/PartnerControls&#039; 
			xmlns:ns3=&#039;b5fc2735-42dd-40f0-a521-255c535f6692&#039; 
			xmlns:ns4=&#039;cb6c538f-4b29-4910-832a-74df7c62e784&#039; &quot; 
			w:xpath=&quot;/ns0:properties[1]/documentManagement[1]/ns3:ProjectName[1]&quot; 
			w:storeItemID=&quot;{59580BC9-FAD5-4EB7-BF24-59B00B2B217C}&quot;/&gt;
		&lt;w:text/&gt;
	&lt;/w:sdtPr&gt;
	&lt;w:sdtEndPr/&gt;
	&lt;w:sdtContent&gt;
		&lt;w:r w:rsidR=&quot;00556E42&quot; w:rsidRPr=&quot;00920EC6&quot;&gt;
			&lt;w:rPr&gt;
				&lt;w:rStyle w:val=&quot;PlaceholderText&quot;/&gt;
			&lt;/w:rPr&gt;
			&lt;w:t&gt;[Project Name]&lt;/w:t&gt;
		&lt;/w:r&gt;
	&lt;/w:sdtContent&gt;
&lt;/w:sdt&gt;
</pre>
<p>So following a hunch I looked up the SPWeb.ID and sure enough, it was the same GUID as ns3.  So, when copying documents from one site to another, the document field xml data from SharePoint must be tied to the GUID of the site it came from.  I was able to verify this by looking at the customXml\item1.xml file (it&#8217;s always makes things a lot easier to be able to view your xml data when working with xpath queries) which showed all of my document fields coming from SharePoint and they all had a namespace of the SPWeb.ID GUID.</p>
<p>Since the namespace will be changing every time I copy the file I decided to update the xpath query to ignore the namespace.  Changing it from:</p>
<pre>w:xpath=&quot;/ns0:properties[1]/documentManagement[1]/ns3:ProjectName[1]&quot;

</pre>
<p>to:</p>
<pre>w:xpath=&quot;/ns0:properties[1]/documentManagement[1]/*[local-name() = &#039;ProjectName&#039;][1]&quot;

</pre>
<p>This xpath trick will query only based on the name of the element and exclude any namespaces.  Sure enough, once I updated the file in my master site and did another copy down to a non-master site, the field updated correctly in word and everything was happy.  You can update the document.xml file using any text editor you&#8217;d like, and then just zip all of your files back up, and then rename the file to be a .docx and it should open correctly in word.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/sharepoint-cross-site-word-document-properties/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">636</post-id>	</item>
		<item>
		<title>Microsoft Band 2 vs Fitbit Surge</title>
		<link>https://steve.thelineberrys.com/microsoft-band-2-vs-fitbit-surge/</link>
					<comments>https://steve.thelineberrys.com/microsoft-band-2-vs-fitbit-surge/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Fri, 22 Jan 2016 20:05:34 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Band2]]></category>
		<category><![CDATA[Fitbit]]></category>
		<category><![CDATA[Surge]]></category>
		<category><![CDATA[Wearables]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=566</guid>

					<description><![CDATA[Last year I was debating between the Microsoft Band or the upcoming Fitbit Surge.  After trying on the band at the Microsoft Store, I was not happy with how it felt on my wrist so I decided to go with <a class="more-link" href="https://steve.thelineberrys.com/microsoft-band-2-vs-fitbit-surge/">Continue reading <span class="screen-reader-text">  Microsoft Band 2 vs Fitbit Surge</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<figure id="attachment_573" aria-describedby="caption-attachment-573" style="width: 272px" class="wp-caption alignleft"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/download.jpg" target="_blank" rel="attachment wp-att-573"><img fetchpriority="high" decoding="async" class="wp-image-573 size-full" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/download.jpg" alt="Microsoft Band 2" width="272" height="185" /></a><figcaption id="caption-attachment-573" class="wp-caption-text"><a href="https://www.microsoft.com/microsoft-band/en-us/features" target="_blank">Microsoft Band 2</a></figcaption></figure>
<p>Last year I was debating between the Microsoft Band or the upcoming Fitbit Surge.  After trying on the band at the Microsoft Store, I was not happy with how it felt on my wrist so I decided to go with the Surge.  I&#8217;ve been using a <a href="https://www.fitbit.com/surge" target="_blank">Fitbit Surge</a> everyday for most of the past year.  For a fitness tracker with GPS, the Surge has been fantastic but I wanted some smartwatch features as well.</p>
<figure id="attachment_577" aria-describedby="caption-attachment-577" style="width: 150px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/61NjouCKL0L._SL1113_.jpg" target="_blank" rel="attachment wp-att-577"><img decoding="async" class="wp-image-577 size-thumbnail" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/61NjouCKL0L._SL1113_-150x150.jpg" alt="Fitbit Surge" width="150" height="150" /></a><figcaption id="caption-attachment-577" class="wp-caption-text"><a href="https://www.fitbit.com/surge" target="_blank">Fitbit Surge</a></figcaption></figure>
<p>After trying on the new <a href="https://www.microsoft.com/microsoft-band/en-us/features" target="_blank">Microsoft Band 2</a> at the Microsoft Store, I decided to get that one to replace my Surge.  Here are my current thoughts on the Band 2 compared to the Surge.</p>
<p><strong>Phone </strong><b>Compatibility</b></p>
<p>The Band 2 works with Android, iOS and Windows Phone but the Cortana (voice) integration isn&#8217;t available on Android and iOS,only on the Windows Phone and the onscreen keyboard isn&#8217;t available on iOS.</p>
<figure id="attachment_594" aria-describedby="caption-attachment-594" style="width: 150px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_31_Rich_LI.jpg" target="_blank" rel="attachment wp-att-575"><img decoding="async" class="wp-image-594 size-thumbnail" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_31_Rich_LI-150x150.jpg" alt="" width="150" height="150" /></a><figcaption id="caption-attachment-594" class="wp-caption-text">View Time and steps (secondary display item is configurable)</figcaption></figure>
<p>I have been using it with my Lumia 950 Windows Phone (<a href="https://steve.thelineberrys.com/what-i-like-and-dislike-about-windows-10-phone/">see post here</a>).  The Fitbit Surge also works on Android, iOS and Windows Phone but some things didn&#8217;t work on the Windows Phone like phone/text notifications and music controls.  I used my Surge mainly on a Windows Phone but my wife has been using it on her iPhone recently.</p>
<p>&nbsp;</p>
<p><strong>Same features as Fitbit Surge</strong></p>
<figure id="attachment_596" aria-describedby="caption-attachment-596" style="width: 300px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_46_Rich_LI.jpg" target="_blank" rel="attachment wp-att-571"><img loading="lazy" decoding="async" class="wp-image-596 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_46_Rich_LI-300x236.jpg" alt="" width="300" height="236" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_46_Rich_LI-300x236.jpg 300w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_46_Rich_LI-768x604.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_46_Rich_LI-1024x805.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-596" class="wp-caption-text">Heart rate monitor</figcaption></figure>
<p>&nbsp;</p>
<ul>
<li>Displays the time and date</li>
<li>Tracks steps, calories burned, distance, floors, heartrate</li>
<li>GPS tracks runs</li>
<li>Tracks other workouts with heartrate like the elliptical</li>
<li>Alarms, timer, stopwatch</li>
</ul>
<p><strong>Pros over Fitbit Surge</strong></p>
<ul>
<li>More notifications
<figure id="attachment_597" aria-describedby="caption-attachment-597" style="width: 150px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_37_Rich_LI.jpg" target="_blank" rel="attachment wp-att-576"><img loading="lazy" decoding="async" class="wp-image-597 size-thumbnail" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_37_Rich_LI-150x150.jpg" alt="" width="150" height="150" /></a><figcaption id="caption-attachment-597" class="wp-caption-text">See full text messages, email partials, and my upcoming calendar</figcaption></figure>
<ul>
<li>Phone (Improvement for Windows Phone only)</li>
<li>Text (Improvement for Windows Phone only)</li>
<li>Email</li>
<li>Facebook</li>
<li>Facebook Messenger</li>
<li>Calendar Reminders</li>
</ul>
</li>
<li>Control music (Improvement for Windows Phone only)</li>
<li>Reply to texts and phone calls
<ul>
<li>Up to 4 quick responses (with automatic detection of a question and showing yes and no as additional quick responses)
<p><figure id="attachment_598" aria-describedby="caption-attachment-598" style="width: 300px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_59_50_Rich_LI.jpg" target="_blank" rel="attachment wp-att-598"><img loading="lazy" decoding="async" class="wp-image-598 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_59_50_Rich_LI-300x177.jpg" alt="The small keyboard used to reply to texts works surprisingly well" width="300" height="177" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_59_50_Rich_LI-300x177.jpg 300w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_59_50_Rich_LI-768x454.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_59_50_Rich_LI-1024x605.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-598" class="wp-caption-text">The small keyboard used to reply to texts works surprisingly well</figcaption></figure></li>
<li>Small keyboard to reply to text messages, which works surprisingly well (Windows Phone and Android only)</li>
<li>Cortana voice dictation to reply to text messages (Windows phone only)</li>
</ul>
</li>
<li>See weather, news, and calendar</li>
<li>Use Cortana to initiate reminders, texts, calls, etc. (Windows phone only)
<ul>
<li>I can even ask questions like &#8220;How old is j-lo&#8221; and the answer shows up on the band screen.
<p><figure id="attachment_600" aria-describedby="caption-attachment-600" style="width: 283px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_29_50_Rich_LI-3.jpg" target="_blank" rel="attachment wp-att-600"><img loading="lazy" decoding="async" class="wp-image-600" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_11_29_50_Rich_LI-3-300x117.jpg" alt="Cortana - &quot;How old is J Lo?&quot;" width="283" height="120" /></a><figcaption id="caption-attachment-600" class="wp-caption-text">Cortana &#8211; &#8220;How old is J Lo?&#8221;</figcaption></figure></li>
</ul>
</li>
<li>See last exercise and sleep
<ul>
<li>On the fitbit this was only available to view using the app or the website, not on the watch itself</li>
</ul>
</li>
<li>Sleep cycle alarm to wake you up, up to 30 mins before scheduled alarm</li>
<li>Prettier design and user interface
<figure id="attachment_591" aria-describedby="caption-attachment-591" style="width: 188px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/sleep.png" target="_blank" rel="attachment wp-att-591"><img loading="lazy" decoding="async" class="wp-image-591" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/sleep-383x1024.png" alt="sleep" width="188" height="503" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/sleep-383x1024.png 383w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/sleep-112x300.png 112w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/sleep-768x2054.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/sleep.png 1440w" sizes="auto, (max-width: 188px) 100vw, 188px" /></a><figcaption id="caption-attachment-591" class="wp-caption-text">A lot better sleep stats compared to Fitbit</figcaption></figure>
<ul>
<li>Lots of people have mentioned that the Band 2 is a MUCH prettier watch than the fitbit surge.</li>
<li>The fitbit surge is large and looks big on my wife where the band 2 would look fine on a male or a female</li>
<li>The fitbit surge had a basic black and white interface whereas the band 2 is colorful and dynamic.</li>
</ul>
</li>
<li>Less bulky
<ul>
<li>Fitbit would get caught when tucking in my shirt, taking off my jacket, or putting on my backpack</li>
</ul>
</li>
<li>Auto detected sleep mode or manual
<ul>
<li>Manual is nice because it also turns off watch mode and notifications other than the watch alarms.</li>
<li>Tracks how long it takes to go sleep.</li>
</ul>
</li>
<li>Watch mode
<ul>
<li>Off</li>
<li>Always on</li>
<li>Rotate</li>
</ul>
</li>
<li>Lots more settings right on the watch, the fitbit had very few settings on the watch itself and was mostly configured using the app or website.
<ul>
<li>Vibrate</li>
<li>Dim
<p><figure id="attachment_595" aria-describedby="caption-attachment-595" style="width: 150px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_23_Rich_LI.jpg" target="_blank" rel="attachment wp-att-569"><img loading="lazy" decoding="async" class="wp-image-595 size-thumbnail" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_23_Rich_LI-150x150.jpg" alt="" width="150" height="150" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_23_Rich_LI-150x150.jpg 150w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_23_Rich_LI-300x300.jpg 300w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_23_Rich_LI-768x765.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_10_23_Rich_LI-1024x1020.jpg 1024w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-595" class="wp-caption-text">Turning my wrist over turns on the low power watch mode for a few seconds</figcaption></figure></li>
</ul>
</li>
<li>Tile and color settings using phone
<ul>
<li>I can even create my own background pictures or download some to the device using additional apps</li>
</ul>
</li>
<li>More info can be seen while during an activity
<ul>
<li>The fitbit displayed a few pieces of data but that data wasn&#8217;t customizable.  Any additional data I had to swipe through at the bottom of the screen.</li>
<li>The band 2 allows me to configure what data I see on the main screen while during an activity and then it provides a single swipe right to see the rest of the data which I configured to be shown.</li>
</ul>
</li>
<li>More analytics on the website and app
<figure id="attachment_590" aria-describedby="caption-attachment-590" style="width: 188px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/run.png" target="_blank" rel="attachment wp-att-590"><img loading="lazy" decoding="async" class="wp-image-590" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/run-280x1024.png" alt="More exercise stats compared to Fitbit" width="188" height="667" /></a><figcaption id="caption-attachment-590" class="wp-caption-text">More exercise stats compared to Fitbit</figcaption></figure>
<ul>
<li>Vo2 max</li>
<li>Max and mins (heart rate, elevation, etc)</li>
<li>Recovery time</li>
</ul>
</li>
<li>UV sensor tells me how long I was exposed to sunlight
<ul>
<li>Considering it&#8217;s currently winter, I haven&#8217;t had a chance to use this a lot yet.</li>
</ul>
</li>
</ul>
<p><strong>Cons/current issues</strong></p>
<ul>
<li>Health app
<ul>
<li><del>No weight tracking</del> &#8211; Now available in February Update</li>
<li>No food tracking
<ul>
<li>The fitibit app is fantastic at tracking food</li>
<li>I used this functionality for a little bit with my fitbit to get an idea but it wasn&#8217;t something I did all the time.</li>
</ul>
</li>
<li>Not Universal Windows Platform and supporting continuum like the Fitbit app (WTH MS, can&#8217;t even utilize your own tech?)</li>
</ul>
</li>
<li>Weird how different types of activities are grouped together</li>
<li>Best feel is wearing on bottom of wrist which feels kind of weird at first but I&#8217;ve gotten used to it.</li>
<li>The clasp took a little bit to get used to but it seems pretty solid</li>
<li>Battery life
<ul>
<li>Fitbit is 5 days
<ul>
<li>I would put it on the charger while taking a shower, giving the kids a bath, and while at the climbing gym
<p><figure id="attachment_599" aria-describedby="caption-attachment-599" style="width: 150px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_12_23_Rich_LI.jpg" target="_blank" rel="attachment wp-att-574"><img loading="lazy" decoding="async" class="wp-image-599 size-thumbnail" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/WP_20160122_10_12_23_Rich_LI-150x150.jpg" alt="" width="150" height="150" /></a><figcaption id="caption-attachment-599" class="wp-caption-text">View from the top of my wrist shows the clasp with integrated battery and the UV sensor.</figcaption></figure></li>
<li>On climbing trips typically I would charge while driving to the location and that was usually enough to last the whole trip</li>
</ul>
</li>
<li>Band 2 is 24-48 hours
<ul>
<li>I&#8217;ve been charging mine nightly when I am sitting down to watch TV (it&#8217;s usually around 50% when I start charging)</li>
<li>Unsure how this is going to work when i am on climbing trips.  I might have to forgo sleep tracking just to maintain a charge.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>Conclusion</strong></p>
<p>I&#8217;ve really enjoyed the Band 2.  It&#8217;s been really handy when playing with my kids. I can put my phone down near by and glace at my watch when receiving texts from my wife or seeing emails come through.  It beats trying to dig my phone out of my pocket only to see the text was from Chick-fil-a telling me about some deal they are running. I&#8217;ve also really enjoyed being able to text my wife or reply to texts from my wrist while playing with the kids or during other activities where my phone isn&#8217;t easily accessible. I wish the app was better and the battery life was a lot better but compared to the advantages, I can get over those things pretty quickly.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/microsoft-band-2-vs-fitbit-surge/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">566</post-id>	</item>
		<item>
		<title>What I like and dislike about Windows 10 Phone</title>
		<link>https://steve.thelineberrys.com/what-i-like-and-dislike-about-windows-10-phone/</link>
					<comments>https://steve.thelineberrys.com/what-i-like-and-dislike-about-windows-10-phone/#respond</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Sun, 17 Jan 2016 03:53:57 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[WindowsPhone]]></category>
		<category><![CDATA[Windows10]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=517</guid>

					<description><![CDATA[So if you are new to Windows Phone, you can refer to my post here on why I like Windows Phone better than iOS.  I recently have been playing around with Windows 10 Mobile on a Lumia 640 and a <a class="more-link" href="https://steve.thelineberrys.com/what-i-like-and-dislike-about-windows-10-phone/">Continue reading <span class="screen-reader-text">  What I like and dislike about Windows 10 Phone</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<figure id="attachment_529" aria-describedby="caption-attachment-529" style="width: 225px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0062-e1452997908976.jpg" target="_blank" rel="attachment wp-att-529"><img loading="lazy" decoding="async" class="wp-image-529 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0062-e1452997908976-225x300.jpg" alt="IMG_0062" width="225" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0062-e1452997908976-225x300.jpg 225w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0062-e1452997908976.jpg 720w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a><figcaption id="caption-attachment-529" class="wp-caption-text">Lumia 950 &#8211; 5.2&#8243; Quad HD (AMOLED, 2560 x 1440), 6-core 1.8 Ghz proc, 3 GB of RAM, 32 GB storage with up to 200 GB expandable with microSD, Dual SIM, 20 MP Camera</figcaption></figure>
<p>So if you are new to Windows Phone, you can refer to my post <a href="https://steve.thelineberrys.com/why-i-like-windows-phone-better-than-ios/" target="_blank">here </a>on why I like Windows Phone better than iOS.  I recently have been playing around with Windows 10 Mobile on a Lumia 640 and a Lumia 950.  This post is mainly my running list of what has improved in Windows 10 Mobile over Windows Phone 8.1 and listing what current cons and issues I have.</p>
<p><strong>Pros over Windows Phone 8.1</strong></p>
<ul type="disc">
<li>Hey Cortana with learn my voice or use any voice
<ul>
<li>Hey Cortana was only on select Windows Phone 8.1 devices</li>
<li>Learn my voice is new in Windows 10 Phone</li>
</ul>
</li>
<li>Continuum (<a href="https://www.youtube.com/watch?v=euDUWtXejXg" target="_blank">See video demonstration here</a>)
<ul type="circle">
<li>Connect to a TV or monitor as a second larger screen to do work on
<p><figure id="attachment_522" aria-describedby="caption-attachment-522" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0001.png" target="_blank" rel="attachment wp-att-522"><img loading="lazy" decoding="async" class="wp-image-522 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0001-169x300.png" alt="Windows Hello - Iris Recognition" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0001-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0001-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0001-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0001.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-522" class="wp-caption-text">Windows Hello &#8211; Iris Recognition</figcaption></figure></li>
<li>Use phone as mouse and keyboard or connect usb/bluetooth devices</li>
</ul>
</li>
<li>Mouse support</li>
<li>Windows Hello (Only on some devices)
<ul>
<li>Iris recognition instead of typing a pin number</li>
</ul>
</li>
<li>Outlook for email
<ul type="circle">
<li>Attach any files on device to emails</li>
<li>Attach from onedrive</li>
</ul>
</li>
<li>Better organized settings</li>
<li>Keyboard joystick
<ul>
<li>Dot near z and x to easily move the cursor around</li>
</ul>
</li>
<li>Notification text and facebook inline reply</li>
<li>Voice dictation built into keyboard</li>
<li>Don&#8217;t forget when powering off
<ul>
<li>Displays a reminder of your next appointment when you power off the device
<p><figure id="attachment_527" aria-describedby="caption-attachment-527" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0001.png" target="_blank" rel="attachment wp-att-527"><img loading="lazy" decoding="async" class="wp-image-527 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0001-169x300.png" alt="Notification inline reply, keyboard joystick, voice dictation easily accessible on keyboard" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0001-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0001-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0001-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0001.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-527" class="wp-caption-text">Notification inline reply, keyboard joystick, voice dictation easily accessible on keyboard</figcaption></figure></li>
</ul>
</li>
<li>Call Recording</li>
<li>Fast USB-C charging (only on some devices)
<ul type="circle">
<li>50% in 30 mins</li>
</ul>
</li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11.0pt;"><strong>Cons/Current issues</strong></p>
<ul type="disc">
<li>NTLM passwords aren&#8217;t saved in Edge</li>
<li>Can&#8217;t connect to NTLM auth OneNote</li>
<li>Excel, PowerPoint and Word can&#8217;t connect to on-prem NTLM SharePoint</li>
<li>Airwatch blocks SD card &#8211; Confirmed bug with airwatch</li>
<li>Airwatch doesn&#8217;t install cert chain &#8211; Maybe fixed with a newer build</li>
<li><del>Cannot open EML attachment in email</del> &#8211; Fixed in Outlook Mail 17.6868.41032.0</li>
<li>Continuum
<ul type="circle">
<li>Only run one app at a time, Can&#8217;t snap apps side by side</li>
<li>Can&#8217;t run on two monitors, only phone screen and one monitor</li>
<li>The apps below are not Universal Windows Platform (uwp) apps that support continuum
<figure id="attachment_552" aria-describedby="caption-attachment-552" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160105_0001-1.png" target="_blank" rel="attachment wp-att-552"><img loading="lazy" decoding="async" class="wp-image-552 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160105_0001-1-169x300.png" alt="Call screen including the record option" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160105_0001-1-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160105_0001-1-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160105_0001-1-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160105_0001-1.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-552" class="wp-caption-text">Call screen including the record option</figcaption></figure>
<ul type="circle">
<li><del>remote desktop</del> (<a href="http://wmpoweruser.com/remote-desktop-preview-app-now-available-for-windows-10-mobile-with-continuum-support/" target="_blank">http://wmpoweruser.com/remote-desktop-preview-app-now-available-for-windows-10-mobile-with-continuum-support/</a>)</li>
<li>Skype for business</li>
<li>Facebook messenger</li>
<li>Citrix Receiver</li>
</ul>
</li>
</ul>
</li>
<li>Option to only try Windows Hello when unlock is needed
<ul type="circle">
<li>Right now Hello will get locked out from too many attempts because of notifications (email, text, etc)</li>
</ul>
</li>
<li>Facebook app needs additional features and bug fixes
<ul type="circle">
<li><span style="text-decoration: line-through;">Live tile not working</span> &#8211; Better in 10.2.1.0</li>
<li>Pinned pages don&#8217;t show notifications on live tile</li>
<li>Some types of content don&#8217;t display correctly
<figure id="attachment_521" aria-describedby="caption-attachment-521" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160108_0001.png" target="_blank" rel="attachment wp-att-521"><img loading="lazy" decoding="async" class="wp-image-521 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160108_0001-169x300.png" alt="Windows Hello tries too much and ends up locking itself out" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160108_0001-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160108_0001-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160108_0001-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160108_0001.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-521" class="wp-caption-text">Windows Hello tries too much and ends up locking itself out</figcaption></figure>
<ul>
<li>Memories</li>
<li>Birthday rollups</li>
</ul>
</li>
</ul>
</li>
<li>Battery life
<ul>
<li>Better after installing 10586.63</li>
</ul>
</li>
<li>Dual Sim
<ul type="circle">
<li><del>No Visual voicemail on dual sim devices</del> &#8211; Fixed in 14267.1004</li>
<li>Should be a way to hide 2nd sim when not used in dual sim</li>
<li><del>No vibrate on answer on dual sim devices</del> &#8211; Fixed in 14283</li>
</ul>
</li>
<li>OneDrive doesn&#8217;t connect to on-prem SharePoint</li>
<li>Live lock screen app from 8.1 isn&#8217;t available</li>
<li><span style="text-decoration: line-through;">Edge does not change to desktop user agent when used on continuum</span>
<ul>
<li>Whatever screen the tab is opened in is the user agent that will be used</li>
</ul>
</li>
<li><del>Random reboots (a lot less after 10586.63)</del>
<ul type="circle">
<li><del>Seemed to happen a lot more at my office.  The following things are potentially different at my office vs at home.</del>
<ul>
<li><del>Bluetooth devices</del></li>
<li><del>AT&amp;T Microcell &#8211; Often after it reboots it says that my carrier has changed my SIM settings and I need to restart again.</del></li>
<li><del>Wireless charging</del></li>
</ul>
</li>
<li><del>Kids corner</del> (Fixed since 10586.71)
<ul>
<li><del>Since 10586.63, I&#8217;ve tried going to kids corner several times from the lock screen and the phone will freeze and eventually reboot.  I have since figured out if I don&#8217;t try to hold it up to my face and let windows hello to attempt to sign me in, then I can go into kids corner successfully.  It seems to be the combination of windows hello attempting to read my iris&#8217;s while I&#8217;m going to kids corner which locks it up.</del></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/what-i-like-and-dislike-about-windows-10-phone/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">517</post-id>	</item>
		<item>
		<title>Why I like Windows Phone better than iOS</title>
		<link>https://steve.thelineberrys.com/why-i-like-windows-phone-better-than-ios/</link>
					<comments>https://steve.thelineberrys.com/why-i-like-windows-phone-better-than-ios/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Sun, 17 Jan 2016 03:08:22 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[WindowsPhone]]></category>
		<category><![CDATA[iOS]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=515</guid>

					<description><![CDATA[The goal in the post is for me to document my running list of why I like Windows Phone better than iOS (iPhone/iPad). Customizable home screen with three different tile sizes.  This enables users that have a hard time seeing <a class="more-link" href="https://steve.thelineberrys.com/why-i-like-windows-phone-better-than-ios/">Continue reading <span class="screen-reader-text">  Why I like Windows Phone better than iOS</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<figure id="attachment_524" aria-describedby="caption-attachment-524" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0003.png" target="_blank" rel="attachment wp-att-524"><img loading="lazy" decoding="async" class="wp-image-524 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0003-169x300.png" alt="Customizable live tiles showing unread counts and information" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0003-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0003-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0003-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0003.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-524" class="wp-caption-text">Customizable live tiles showing unread counts and information</figcaption></figure>
<p>The goal in the post is for me to document my running list of why I like Windows Phone better than iOS (iPhone/iPad).</p>
<ul>
<li>Customizable home screen with three different tile sizes.  This enables users that have a hard time seeing small text or hitting small buttons can make them bigger.</li>
<li>Live tiles show more information when not using the small size which shows alerts directly on the home screen whereas iOS only shows the number of notifications.</li>
<li>Swipe right enables viewing all installed apps with search and jump by alpha.  Unlike iOS where every app installed has to be in a home page somewhere</li>
<li>Can have a combined tile for all email, separate tile for each email address or link several mailboxes together such as Gmail and Hotmail can be linked together as a personal inbox and keep work inbox separate
<p><figure id="attachment_525" aria-describedby="caption-attachment-525" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0004.png" target="_blank" rel="attachment wp-att-525"><img loading="lazy" decoding="async" class="wp-image-525 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0004-169x300.png" alt="Swiping right shows all apps with easy to find by alpha or using search" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0004-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0004-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0004-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160114_0004.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-525" class="wp-caption-text">Swiping right shows all apps with easy to find by alpha or using search</figcaption></figure></li>
<li>Can combine tiles into a tile folder</li>
<li>Driving mode
<ul>
<li>Reads texts to you over bluetooth</li>
<li>Can dictate responses over bluetooth</li>
<li>Does not popup or sound notifications for anything except phone and text
<ul>
<li>Can also turn off phone and/or text as well</li>
</ul>
</li>
</ul>
</li>
<li>Kids corner
<ul>
<li>Swipe right to show a start screen that you configured just for your kids and the apps they are allowed to use</li>
<li>Need PIN to get back into normal phone mode.</li>
<li>No longer can your child send your boss an email by accident.</li>
</ul>
</li>
<li>Gadgets app
<ul>
<li>Run apps when accessories connect</li>
<li>Find accessory by seeing on a map where you last disconnected the accessory</li>
</ul>
</li>
<li>Near Field Communication (NFC) can be used for more things than just payments like in iOS
<p><figure id="attachment_528" aria-describedby="caption-attachment-528" style="width: 225px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0061-e1452997925918.jpg" target="_blank" rel="attachment wp-att-528"><img loading="lazy" decoding="async" class="wp-image-528 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0061-e1452997925918-225x300.jpg" alt="The Glance Screen is like a low powered notification screen." width="225" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0061-e1452997925918-225x300.jpg 225w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/IMG_0061-e1452997925918.jpg 720w" sizes="auto, (max-width: 225px) 100vw, 225px" /></a><figcaption id="caption-attachment-528" class="wp-caption-text">The Glance Screen is like a low powered notification screen.</figcaption></figure></li>
<li>Wireless charging in some models</li>
<li>Standard USB charging cable (micro or newer type c)</li>
<li>Full desktop class browser which can switch from mobile user agent to desktop one</li>
<li>Social integration with contacts so when you get a new friend in Facebook or twitter they can show up as a contact</li>
<li>Glance screen
<ul>
<li>Low powered screen that shows the time, date, next appointment and notification count.</li>
</ul>
</li>
<li>Expand storage with SD cards</li>
<li>Battery Saver
<figure id="attachment_536" aria-describedby="caption-attachment-536" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0003.png" target="_blank" rel="attachment wp-att-536"><img loading="lazy" decoding="async" class="wp-image-536 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0003-169x300.png" alt="Wi-Fi can automatically turn back on" width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0003-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0003-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0003-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0003.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-536" class="wp-caption-text">Wi-Fi can automatically turn back on</figcaption></figure>
<ul>
<li>Turns off checking for email and other background tasks to help save battery</li>
<li>Can automatically turn on at 20% battery</li>
</ul>
</li>
<li>Configure apps from within the app instead of needing to leave and go to settings</li>
<li>When turning off WiFi, option to turn back on based on a time frame or when at a favorite place such as home</li>
<li>Cortana &#8211; Personal Digital Assistant with voice recognition
<ul>
<li>Quiet Hours
<ul>
<li>Inner circle can break through</li>
</ul>
</li>
<li>Collection of news and other information that is important to you</li>
<li>Reminders
<ul>
<li>Place
<ul>
<li>
<figure id="attachment_537" aria-describedby="caption-attachment-537" style="width: 169px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0002.png" target="_blank" rel="attachment wp-att-537"><img loading="lazy" decoding="async" class="wp-image-537 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0002-169x300.png" alt="Cortana is your personal digital assistant. Here she is giving me a run down of my interests." width="169" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0002-169x300.png 169w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0002-768x1365.png 768w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0002-576x1024.png 576w, https://steve.thelineberrys.com/wp-content/uploads/2016/01/wp_ss_20160116_0002.png 1440w" sizes="auto, (max-width: 169px) 100vw, 169px" /></a><figcaption id="caption-attachment-537" class="wp-caption-text">Cortana is your personal digital assistant. Here she is giving me a run down of my interests.</figcaption></figure>
<p>Remind me to buy print cartridges next time I&#8217;m at the Best Buy off Rea road</li>
<li>Remind me to pick up groceries when I leave work</li>
<li>Remind me to start laundry when I arrive home</li>
</ul>
</li>
<li>Person
<ul>
<li>Remind me to ask my Mom how her cat is doing next time I&#8217;m in contact with her (phone, email, text)</li>
</ul>
</li>
<li>Time</li>
</ul>
</li>
<li>Text message with nicknames
<ul>
<li>Text message my wife on my way</li>
<li>Text message my manager I&#8217;m running late</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/why-i-like-windows-phone-better-than-ios/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">515</post-id>	</item>
		<item>
		<title>2015 Climbing Goals Recap</title>
		<link>https://steve.thelineberrys.com/2015-climbing-goals-recap/</link>
					<comments>https://steve.thelineberrys.com/2015-climbing-goals-recap/#respond</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Wed, 30 Dec 2015 16:20:40 +0000</pubDate>
				<category><![CDATA[Outdoors]]></category>
		<category><![CDATA[Rock Climbing]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=487</guid>

					<description><![CDATA[Erica does a year in review for her climbing goals (click here for her&#8217;s) so I decided to document mine as well.  Below were some of my goals for 2015 and other thoughts on how the year went. I really <a class="more-link" href="https://steve.thelineberrys.com/2015-climbing-goals-recap/">Continue reading <span class="screen-reader-text">  2015 Climbing Goals Recap</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<figure id="attachment_492" aria-describedby="caption-attachment-492" style="width: 300px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC04897.jpg" rel="attachment wp-att-492"><img loading="lazy" decoding="async" class="wp-image-492 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC04897-300x200.jpg" alt="Onsight of Tricks for You (5.12a)" width="300" height="200" srcset="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC04897-300x200.jpg 300w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC04897-768x512.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC04897-1024x683.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-492" class="wp-caption-text">Onsight of Tricks for You (5.12a)</figcaption></figure>
<p>Erica does a year in review for her climbing goals (<a href="http://cragmama.com/2015/12/climbing-in-2015-the-year-in-review" target="_blank">click here for her&#8217;s</a>) so I decided to document mine as well.  Below were some of my goals for 2015 and other thoughts on how the year went.</p>
<p>I really liked Erica&#8217;s 12 5.12&#8217;s in 2012 goal a few years ago (<a href="http://cragmama.com/2012/11/twelve-5-12s-in-2012-and-fashion-makes-it-a-dozen/" target="_blank">see post on cragmama here</a>) so I decided to try to send 15 5.12&#8217;s in 2015.  It doesn&#8217;t have the same ring to it but I ended up surpassing the goal with sending (excluding repeats) 20 5.12&#8217;s in 2015.</p>
<figure id="attachment_496" aria-describedby="caption-attachment-496" style="width: 200px" class="wp-caption alignleft"><a href="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC05395-2.jpg" rel="attachment wp-att-496"><img loading="lazy" decoding="async" class="wp-image-496 size-medium" src="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC05395-2-200x300.jpg" alt="DSC05395" width="200" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC05395-2-200x300.jpg 200w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC05395-2-768x1152.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC05395-2-683x1024.jpg 683w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC05395-2.jpg 2000w" sizes="auto, (max-width: 200px) 100vw, 200px" /></a><figcaption id="caption-attachment-496" class="wp-caption-text">Left El Shinto (5.12b)</figcaption></figure>
<p>Ten Sleep helped a lot with this goal because I sent 6 5.12&#8217;s there with all of them being 2 goes except for one which I onsighted (<strong>Tricks for You 5.12a</strong>).  By September I had achieved my goal with my 15th send of the year when I sent <strong>Fine Motor Control (5.12a)</strong>.</p>
<p>After having some luck in the 5.12b range this year I was hoping to send a 5.12c at some point.  I worked on <strong>Hard Rock Café (5.12c)</strong> several times but walked away with only a one hang.  I had picked out what seemed like a perfect 5.12c for me in Ten Sleep called <strong>Left El Shinto</strong>.  Unfortunately, others also felt like it was too perfect and in the recently released latest guidebook, the route had been downgraded to 5.12b.  I did send the route but ended up giving myself a 5.12b credit for it.</p>
<figure id="attachment_503" aria-describedby="caption-attachment-503" style="width: 300px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06469.jpg" rel="attachment wp-att-503"><img loading="lazy" decoding="async" class="size-medium wp-image-503" src="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06469-300x200.jpg" alt="Techman (5.12c)" width="300" height="200" srcset="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06469-300x200.jpg 300w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06469-768x512.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06469-1024x683.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-503" class="wp-caption-text">Techman (5.12c)</figcaption></figure>
<p>After I sent <strong>Freaky Stylee (5.12a)</strong> earlier this year I decided to get on <strong>Techman (5.12c)</strong> with Erica this fall.  <strong>Techman</strong> is a V5/6 boulder problem into some hard 5.11 climbing and shares the same 5.12a crux finish with <strong>Freaky Stylee</strong>.  It ended up taking me 3 attempts to send and the send was epic.  I almost fell off at crimpy crux and at two of the hard 5.11 moves later.  What I was really excited about was the <strong>Freaky Stylee</strong> crux which I fell at so many times in the spring and in the past few years I did without any issues both times I tried it that day.</p>
<p><a href="https://steve.thelineberrys.com/wp-content/uploads/2015/12/2015-12-30_8-58-32.png" rel="attachment wp-att-488"><img loading="lazy" decoding="async" class="alignleft wp-image-488 size-full" src="https://steve.thelineberrys.com/wp-content/uploads/2015/12/2015-12-30_8-58-32.png" alt="2015-12-30_8-58-32" width="861" height="392" srcset="https://steve.thelineberrys.com/wp-content/uploads/2015/12/2015-12-30_8-58-32.png 861w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/2015-12-30_8-58-32-300x137.png 300w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/2015-12-30_8-58-32-768x350.png 768w" sizes="auto, (max-width: 861px) 100vw, 861px" /></a>I use <a href="http://8a.nu" target="_blank">8a.nu</a> to track my sends and I really enjoy their ranking system.  I set out a goal for my all time score to be equal to my yearly score.  What this basically means is that the top 10 sends of my life happened this year.  I wasn&#8217;t sure it was going to happen because I needed to have 10 of at least the following:  5.12b, 5.12a second go, 5.11d flash, 5.11b/c onsight.  While at Ten Sleep I was able to accomplish this goal.  Here&#8217;s a <a href="http://www.8a.nu/?IncPage=http%3A//www.8a.nu/scorecard/AscentList.aspx%3FUserId%3D48502%26AscentType%3D0%26AscentClass%3D0%26AscentListTimeInterval%3D1%26AscentListViewType%3D0%26ListYear%3D2015%26GID%3Df5df4139c0f6e7b4edef52f81caf8041" target="_blank">link </a>so see how I did for the year.</p>
<figure id="attachment_494" aria-describedby="caption-attachment-494" style="width: 200px" class="wp-caption alignleft"><a href="https://steve.thelineberrys.com/wp-content/uploads/2015/12/11337058_10153916883813312_5286281776078963296_o.jpg" rel="attachment wp-att-494"><img loading="lazy" decoding="async" class="size-medium wp-image-494" src="https://steve.thelineberrys.com/wp-content/uploads/2015/12/11337058_10153916883813312_5286281776078963296_o-200x300.jpg" alt="Gangsta (5.12a)" width="200" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2015/12/11337058_10153916883813312_5286281776078963296_o-200x300.jpg 200w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/11337058_10153916883813312_5286281776078963296_o-768x1151.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/11337058_10153916883813312_5286281776078963296_o-683x1024.jpg 683w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/11337058_10153916883813312_5286281776078963296_o.jpg 1366w" sizes="auto, (max-width: 200px) 100vw, 200px" /></a><figcaption id="caption-attachment-494" class="wp-caption-text">Gangsta (5.12a)</figcaption></figure>
<p>I have bouldered well at the gym by getting a lot of V5&#8217;s and V6&#8217;s (including a stray V7 and V8).  I was hoping to have an outside send of at least a V5 this year but it didn&#8217;t happen.  We didn&#8217;t boulder outside at all this past year.  My birthday bouldering bash was rained out in January, Hound Ears was postponed and since we were so ropes focused because of our Ten Sleep trip, we just didn&#8217;t make it a priority.  Hopefully next year.</p>
<figure id="attachment_501" aria-describedby="caption-attachment-501" style="width: 200px" class="wp-caption alignright"><a href="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06421-1.jpg" rel="attachment wp-att-501"><img loading="lazy" decoding="async" class="size-medium wp-image-501" src="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06421-1-200x300.jpg" alt="Check Your Grip (5.12a)" width="200" height="300" srcset="https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06421-1-200x300.jpg 200w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06421-1-768x1152.jpg 768w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06421-1-683x1024.jpg 683w, https://steve.thelineberrys.com/wp-content/uploads/2015/12/DSC06421-1.jpg 2000w" sizes="auto, (max-width: 200px) 100vw, 200px" /></a><figcaption id="caption-attachment-501" class="wp-caption-text">Check Your Grip (5.12a)</figcaption></figure>
<p>Lastly, it felt great to get redemption on a few routes that gave me issues last year.  <strong>Freaky Stylee (5.12a)</strong> took me a total of 9 attempts and <strong>Gangsta (5.12a)</strong> took me a total of 16 attempts to send.  I was also excited to get several sends that are steeper such as <strong>Lost Souls (5.12a)</strong> and <strong>Check your Grip (5.12a)</strong>.  Other memorable moments were sending three 5.12&#8217;s in a single weekend (<strong>Freaky Stylee (5.12a)</strong> on a Saturday and then <strong>Fired For Sandbagging (5.12a)</strong> and <strong>Michelin Man Original Finish (5.12b) </strong>on Sunday) and onsighting <strong>Tony The Tiger (5.11c)</strong>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/2015-climbing-goals-recap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">487</post-id>	</item>
		<item>
		<title>Unable to Manually Start Workflows</title>
		<link>https://steve.thelineberrys.com/unable-to-manually-start-workflows/</link>
					<comments>https://steve.thelineberrys.com/unable-to-manually-start-workflows/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Mon, 22 Sep 2014 19:51:14 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[SharePoint 2013]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=464</guid>

					<description><![CDATA[Recently, after we finished migrating our large external farm from SharePoint 2010 to SharePoint 2013, I started hearing complaints that some user&#8217;s could not manually start workflows.  They would either get a 403 Forbidden or get the &#8220;Sorry, you don&#8217;t <a class="more-link" href="https://steve.thelineberrys.com/unable-to-manually-start-workflows/">Continue reading <span class="screen-reader-text">  Unable to Manually Start Workflows</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Recently, after we finished migrating our large external farm from SharePoint 2010 to SharePoint 2013, I started hearing complaints that some user&#8217;s could not manually start workflows.  They would either get a 403 Forbidden or get the &#8220;Sorry, you don&#8217;t have access to this page&#8221; message.</p>
<p><a href="https://steve.thelineberrys.com/wp-content/uploads/2014/09/2014-09-16_8-57-02.png"><img loading="lazy" decoding="async" class="alignnone wp-image-465 size-large" src="https://steve.thelineberrys.com/wp-content/uploads/2014/09/2014-09-16_8-57-02-1024x625.png" alt="2014-09-16_8-57-02" width="1024" height="625" srcset="https://steve.thelineberrys.com/wp-content/uploads/2014/09/2014-09-16_8-57-02-1024x625.png 1024w, https://steve.thelineberrys.com/wp-content/uploads/2014/09/2014-09-16_8-57-02-300x183.png 300w, https://steve.thelineberrys.com/wp-content/uploads/2014/09/2014-09-16_8-57-02.png 1046w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></p>
<p>The stack trace on the back end produced the following:</p>
<pre>Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(HttpContext context) at Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(Exception ex) at Microsoft.SharePoint.SPSecurableObject.CheckPermissions(SPBasePermissions permissionMask) at Microsoft.SharePoint.WorkflowServices.StoreSubscriptionService.EnumerateSubscriptionsByEventSource(Guid eventSourceId) at Microsoft.SharePoint.WorkflowServices.ApplicationPages.WorkflowPage.ConstructStartArray() at Microsoft.SharePoint.WorkflowServices.ApplicationPages.WorkflowPage.OnLoad(EventArgs e)</pre>
<p>Figuring out the problem just took a little investigation.  I recently used this as a Demo for a <a title="Speaking at SharePoint Saturday Charlotte 2014" href="https://steve.thelineberrys.com/speaking-at-sharepoint-saturday-charlotte-2014/">SharePoint session I did recently at my local SharePoint Saturday</a>.  From that session I have a video of the issue and how I determined the cause.  Skip to about 2:15 for the start of the issue and investigation.  <a href="https://steve.thelineberrys.com/?attachment_id=466" target="_blank">Click here to see the video</a></p>
<p>So basically the new SharePoint 2013 Workflow Manager is checking for Contribute access at the Site (SPWeb) scope when determining if someone should see the list of workflows for a list (see first line of the method in the code below).</p>
<pre class="brush: csharp; gutter: true">// Microsoft.SharePoint.WorkflowServices.StoreSubscriptionService
public override WorkflowSubscriptionCollection EnumerateSubscriptionsByEventSource(Guid eventSourceId)
{
	this.context.Web.CheckPermissions(SPBasePermissions.EditListItems);
	WorkflowStore workflowStore = new WorkflowStore(this.context.Web);
	eventSourceId = StoreSubscriptionService.ConvertToGuidToken(eventSourceId, this.context.Web);
	WorkflowFile[] files = workflowStore.QueryWithGuid(&quot;0x0100AA27A923036E459D9EF0D18BBD0B9587&quot;, StoragePublishState.Unchanged, &quot;WSEventSourceGUID&quot;, eventSourceId);
	return this.ConvertToWorkflowSubscriptionCollection(files);
}</pre>
<p>So in our scenario, our users had read access to the site but contribute access on the list.  This should allow them to start the workflow and it did in SP 2010.  I currently have a Design Change Request (DCR) open with MS regarding this issue so hopefully it will be fixed soon.  Once I hear more, I will update this post.  In the meantime there seems to be two workarounds.</p>
<p><strong>Workaround 1:</strong>  Earlier in the code I determined that if you DON&#8217;T setup and connect a SharePoint 2013 Workflow Manager to the farm, then this code will never run and thus it will work just like it did in SP 2010.  Of course the issue with this workaround is you can&#8217;t have any SP 2013 workflows.</p>
<p><strong>Workaround 2:</strong>  Basically give everyone that needs to manually start workflows contribute access to the site, and then break inheritance to all lists and libraries where the user DOESN&#8217;T need contribute access and remove their contribute access.</p>
<p>We ended up implementing the second workaround above which sucks for my users.  I am hoping this is fixed soon as I have also seen other people complaining about it (<a href="http://sharepoint.stackexchange.com/questions/115311/manually-start-sharepoint-2010-workflow-in-sharepoint-2013-farm/">http://sharepoint.stackexchange.com/questions/115311/manually-start-sharepoint-2010-workflow-in-sharepoint-2013-farm/</a>)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/unable-to-manually-start-workflows/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">464</post-id>	</item>
		<item>
		<title>Speaking at SharePoint Saturday Charlotte 2014</title>
		<link>https://steve.thelineberrys.com/speaking-at-sharepoint-saturday-charlotte-2014/</link>
					<comments>https://steve.thelineberrys.com/speaking-at-sharepoint-saturday-charlotte-2014/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Thu, 18 Sep 2014 18:37:42 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[SharePoint 2013]]></category>
		<category><![CDATA[SharePoint Saturday]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=455</guid>

					<description><![CDATA[I am speaking at the Charlotte SharePoint Saturday 2014 event this Saturday.  Below is my abstract and slide deck if you are interested.  If you are a reader of my blog and are going to the event, please stop by <a class="more-link" href="https://steve.thelineberrys.com/speaking-at-sharepoint-saturday-charlotte-2014/">Continue reading <span class="screen-reader-text">  Speaking at SharePoint Saturday Charlotte 2014</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>I am speaking at the <a href="http://www.spsevents.org/city/Charlotte/CLT2014/home">Charlotte SharePoint Saturday 2014</a> event this Saturday.  Below is my abstract and slide deck if you are interested.  If you are a reader of my blog and are going to the event, please stop by and say hello.</p>
<p><strong>Session Title:</strong>  <a href="http://www.spsevents.org/city/Charlotte/CLT2014/_layouts/15/SPSEvents/Speakers/Session.aspx?SpeakerId=515&amp;ID=21">Unwrapping the Black Box: Advanced SharePoint Troubleshooting and Forensics</a></p>
<p><strong>Session Topic:</strong>  SharePoint can often feel like a black box, and with little to no knowledge of internal workings, troubleshooting can be daunting. In this session, I remind you that SharePoint is nothing more than ASP.NET Web Forms and apply some of the same troubleshooting techniques to get you out of the dark. I will also delve into some SharePoint specific tools and demonstrate actual errors and troubleshooting where the resolution requires reading Microsoft SharePoint code.</p>
<p>Tools/Techniques</p>
<ul>
<li>Internet Explorer F12 Developer Tools</li>
<li>Fiddler2</li>
<li>Developer Dashboard</li>
<li>ULS Viewer</li>
<li>SharePoint Manager</li>
<li>Reflector/ILSpy</li>
<li>SQL Profiler</li>
</ul>
<p><a title="SharePoint Saturday 2014" href="https://steve.thelineberrys.com/wp-content/uploads/2014/09/SharePoint Saturday 2014 - Unwrapping the Black Box - Advanced Troubleshooting and Forensics with video demos.pptx">Click here for the presentation including embedded videos of demos and scenarios.</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/speaking-at-sharepoint-saturday-charlotte-2014/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">455</post-id>	</item>
		<item>
		<title>SharePoint 2013 conflicts with custom site definition</title>
		<link>https://steve.thelineberrys.com/sharepoint-2013-conflicts-with-custom-site-definition/</link>
					<comments>https://steve.thelineberrys.com/sharepoint-2013-conflicts-with-custom-site-definition/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Sun, 30 Mar 2014 15:30:49 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[SharePoint 2013]]></category>
		<category><![CDATA[Troubleshooting]]></category>
		<category><![CDATA[Site Definition]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=430</guid>

					<description><![CDATA[I was updating one of our custom Site Definitions from SharePoint 2010 to SharePoint 2013 recently and everything was going good until I tried to create a site from the updated definition.  I kept getting the error: Microsoft.SharePoint.SPException: The template <a class="more-link" href="https://steve.thelineberrys.com/sharepoint-2013-conflicts-with-custom-site-definition/">Continue reading <span class="screen-reader-text">  SharePoint 2013 conflicts with custom site definition</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>I was updating one of our custom Site Definitions from SharePoint 2010 to SharePoint 2013 recently and everything was going good until I tried to create a site from the updated definition.  I kept getting the error:</p>
<pre>Microsoft.SharePoint.SPException: The template you have 
chosen is invalid or cannot be found.</pre>
<p>Searching on the internet told me the most common cause of this error was a conflicting ID for the template.  I was pretty sure this couldn&#8217;t be the case since we followed the instructions here:  <a href="http://msdn.microsoft.com/en-us/library/office/ms454677(v=office.14).aspx">http://msdn.microsoft.com/en-us/library/office/ms454677(v=office.14).aspx</a> which stated:</p>
<pre>Change the ID attribute of the Template element to a 
value of 10000 or more. This ensures that your ID will 
not conflict with future site definitions produced by 
Microsoft. If there are other custom site definitions 
on your target farm, make sure that each one has a 
unique ID.</pre>
<p>and we had given our template an ID of 10000.  I had previously updated another custom site definition of ours with an ID of 10001 without any issues.</p>
<p>So I decided to give a quick search in the SharePointRoot\template\1033\XML folder for anything that contains ID=&#8221;10000&#8243;.  Sure enough I found two site definitions, mine and a new one that comes with SharePoint 2013 called the Academic Library.</p>
<p>I found this article:  <a href="http://social.technet.microsoft.com/wiki/contents/articles/20149.sharepoint-2013-default-site-templates.aspx">http://social.technet.microsoft.com/wiki/contents/articles/20149.sharepoint-2013-default-site-templates.aspx</a> which discusses the new site definitions that come with SharePoint 2013.  You can see it listed there as:</p>
<table style="width: 400pt; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0">
<colgroup>
<col />
<col />
<col /> </colgroup>
<tbody>
<tr style="height: 15pt;">
<td class="xl65" style="border: 0.5pt solid windowtext; width: 37pt; height: 15pt; background-color: #f2f2f2;"><strong><span style="color: #595959; font-family: 'Segoe UI'; font-size: 11px;">ID</span></strong></td>
<td class="xl66" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext #595959; background-color: #f2f2f2;"><strong><span style="color: #595959; font-family: 'Segoe UI'; font-size: 11px;">Name</span></strong></td>
<td class="xl66" style="border-width: 0.5pt 0.5pt 0.5pt 0px; border-style: solid solid solid none; border-color: windowtext windowtext windowtext #595959; background-color: #f2f2f2;"><strong><span style="color: #595959; font-family: 'Segoe UI'; font-size: 11px;">Title</span></strong></td>
</tr>
<tr>
<td class="xl63" style="border: 0px black; background-color: transparent;"><span style="font-family: 'Segoe UI'; font-size: 11px;">10000</span></td>
<td class="xl63" style="border: 0px black; background-color: transparent;"><span style="font-family: 'Segoe UI'; font-size: 11px;">DOCMARKETPLACESITE#0</span></td>
<td class="xl63" style="border: 0px black; background-color: transparent;"><span style="font-family: 'Segoe UI'; font-size: 11px;">Academic Library</span></td>
</tr>
<tr>
<td class="xl64" style="border: 0px black; width: 353pt; background-color: transparent;" colspan="3"><span style="font-family: 'Segoe UI'; font-size: 11px;">The Academic Library template provides a rich view and consumption experience for published content and management. Authors populate metadata and apply rules at the time of publishing, such as description, licensing, and optional rights management.(IRM). Visitors of the site can search or browse published titles and add authorized selections to their collection to consume, subject to the rights and rules applied by the author. The site provides an IRM-capable document library, a publishing mechanism for authors to publish documents, detailed views for each document, a check-out mechanism, and related search capabilities.</span></td>
</tr>
</tbody>
</table>
<p>So it would seem that if you followed the recommendations for SharePoint 2010 and used an ID of 10000 for your custom site definition, then when you try to go to SharePoint 2013, your site definition won&#8217;t work.</p>
<p>This is an issue because there is not a way to change the template ID of a site after it&#8217;s been created through the API.  Fortunately, I have found 2 ways to get around this.  One of them I haven&#8217;t fully run to ground and verified that it works but the concept seems valid and the other isn&#8217;t supported by Microsoft.</p>
<p><strong>Option 1:</strong></p>
<p>This option I got the idea from this blog:  <a href="http://iknowsharepoint2007.blogspot.com/2010/02/changing-sharepoint-site-definition.html">http://iknowsharepoint2007.blogspot.com/2010/02/changing-sharepoint-site-definition.html</a>.  The basic idea is you export your site without using compression, change some xml configuration files so they use your new ID, and then import it back into your SharePoint environment.  You might not even have to change any xml files since that post was for SP 2007.  If someone tries this method, please comment below, otherwise if I find time to give it a try, i&#8217;ll update with my findings here.</p>
<p><strong>Option 2:</strong></p>
<p>This involved editing data directly in the SharePoint content database.  This is unsupported by Microsoft but worked for me during my testing.  Go to the AllWebs table in the content database for the site in question.  You should be able to find your site listed by scanning the FullUrl column.  Once found, write a SQL update statement which updates the WebTemplate column to the new site definition ID.  This was an instant fix for me as I was able to immediately start the upgrade to SharePoint 2013 for that site collection.</p>
<p>It sucks that Microsoft told us they would never use Site Definitions ID of 10000 or more and then they go back on their word with SharePoint 2013.  Anyways, I hope this helps someone else out trying to complete their migration to SharePoint 2013.  If anyone finds a better way to fix the issue, please post in the comments below.  Thanks.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/sharepoint-2013-conflicts-with-custom-site-definition/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">430</post-id>	</item>
		<item>
		<title>Warning: SetCookie changes implementation in SharePoint 2013</title>
		<link>https://steve.thelineberrys.com/warning-setcookie-changes-implementation-in-sharepoint-2013/</link>
					<comments>https://steve.thelineberrys.com/warning-setcookie-changes-implementation-in-sharepoint-2013/#comments</comments>
		
		<dc:creator><![CDATA[Steve Lineberry]]></dc:creator>
		<pubDate>Sat, 29 Mar 2014 00:09:06 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[SharePoint 2013]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://steve.thelineberrys.com/?p=424</guid>

					<description><![CDATA[I was recently working on verifying some of my custom code worked in SharePoint 2013.  I had some older code where I needed to set cookies and use them to remember user preferences.  I was debugging my code and I <a class="more-link" href="https://steve.thelineberrys.com/warning-setcookie-changes-implementation-in-sharepoint-2013/">Continue reading <span class="screen-reader-text">  Warning: SetCookie changes implementation in SharePoint 2013</span><span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>I was recently working on verifying some of my custom code worked in SharePoint 2013.  I had some older code where I needed to set cookies and use them to remember user preferences.  I was debugging my code and I noticed that all of my cookies were coming back either true or false instead of the value I put into them.  I had been using a SharePoint JavaScript method called SetCookie.  Below is the implementation that has existed in SharePoint for the previous 3 versions (2003, 2007, and 2010).</p>
<pre class="brush: javascript; gutter: true">function SetCookie(name, value, path)
{
	document.cookie=name+&quot;=&quot;+value+&quot;;path=&quot;+path;
}</pre>
<p>But for some reason Microsoft decided to change the implementation of this method in SharePoint 2013 to the following:</p>
<pre class="brush: javascript; gutter: true">function SetCookie(sName, value) {
    SetCookieEx(sName, value, false, window);
}
function SetCookieEx(sName, value, isGlobal, wnd) {
    var c = sName + (value ? &quot;=true&quot; : &quot;=false&quot;);
    var p = isGlobal ? &quot;;path=/&quot; : &quot;&quot;;

    wnd.document.cookie = c + p;
}</pre>
<p>Notice this new method tries to evaluate the value into a boolean and then forcefully sets the cookie to true or false.  So if you were storing anything other than boolean values in your cookies and used this method in previous versions of SharePoint, you will now need to update your code.  For this you have two options:</p>
<p><strong>Option 1:</strong>  I found there is another method in SharePoint 2013 which still implements the SetCookie the same was as previous versions of SharePoint.</p>
<pre class="brush: javascript; gutter: true">function SetMtgCookie(cookieName, value, path) {
    document.cookie = cookieName + &quot;=&quot; + value + &quot;;path=&quot; + path;

}</pre>
<p>So you can easily do a search and replace for SetCookie to be replaced with SetMtgCookie and you&#8217;ll be good to go.</p>
<p><strong>Option 2:</strong>  This is the option I opted for.  I decided that as tempting as doing a quick search and replace like I suggested in option 1 sounded, I wanted to remove my dependency on SharePoint&#8217;s implementation in case it changes again in the future.  Since the older SetCookie is only one line, I just replaced my method call to that line:</p>
<pre class="brush: javascript; gutter: true">document.cookie=name+&quot;=&quot;+value+&quot;;path=&quot;+path;</pre>
<p>It was a pretty simple change, only slightly more time taken than option 1 and I removed a dependency.</p>
<p>Anyway, I hope this helps someone else out when troubleshooting code migration to SharePoint 2013.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://steve.thelineberrys.com/warning-setcookie-changes-implementation-in-sharepoint-2013/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">424</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/


Served from: steve.thelineberrys.com @ 2026-03-30 18:22:52 by W3 Total Cache
-->