{"id":2349,"date":"2014-04-14T11:00:07","date_gmt":"2014-04-14T15:00:07","guid":{"rendered":"http:\/\/sqlity.net\/en\/?p=2349"},"modified":"2014-11-13T12:30:21","modified_gmt":"2014-11-13T17:30:21","slug":"scripting-all-logins","status":"publish","type":"post","link":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/","title":{"rendered":"Scripting All Logins on a SQL Server Instance"},"content":{"rendered":"<div>\n<h3>Introduction<\/h3>\n<p>\nYesterday I showed you how to <a href=\"http:\/\/sqlity.net\/en\/2344\/create-login-with-hashed-password\/\">create a SQL login with a hashed password<\/a>. Today I would like to show you a T-SQL statement that you can use to automatically generate create statements for all logins on the instance.\n<\/p>\n<h3>Scripting All SQL Server Logins<\/h3>\n<p>\nThere are many use cases for such a generated script. You can use it for example to copy all logins from a production instance to a development instance. But, before we can generate such a script we need to lay some ground work.\n<\/p>\n<p>\nThe first question we need to answer is: What type of principals do we need to include? Of the six server principal types knows to SQL Server, three can be used to actually connect to an instance: SQL_LOGIN, WINDOWS_LOGIN and WINDOWS_GROUP. Therefore, it makes sense to include those three.\n<\/p>\n<p>\nThe next question is what to do with logins that exist already. For logins of type WINDOWS_LOGIN or WINDOWS_GROUP it makes sense to just leave the existing ones untouched. An existing SQL_LOGIN on the other hand we could alter, for example to take the hashed password. But, if the login exists already, something might be using it, so automatically changing the password is probably not a good idea. That means we need a way to check for existence and only create the login (of any type) if it is new. We can use the <span class=\"tt\">SUSER_ID()<\/span> function for that:\n<\/p>\n<div>\n[sql]\nIF(SUSER_ID('LoginName') IS NULL)BEGIN ... END;<br \/>\n[\/sql]\n<\/div>\n<p>\nFinally, we need to think about logins shipped by Microsoft, as we do not want to touch those either. <span class=\"tt\">sys.objects<\/span> has a column <span class=\"tt\">is_ms_shipped<\/span> that provides just that information. Unfortunately, there is no equivalent in sys.server_principals. Therefore we need to filter based on another feature. It seems that Microsoft is following a naming convention, giving all MS shipped logins names that start and end with two # signs. Besides of those logins there is the famous <span class=\"tt\">sa<\/span> login that we should also ignore. Putting that all together leads to a <span class=\"tt\">WHERE<\/span> clause like this:\n<\/p>\n<div>\n[sql]\n  WHERE SP.type_desc IN ('SQL_LOGIN','WINDOWS_GROUP','WINDOWS_LOGIN')<br \/>\n    AND SP.name NOT LIKE '##%##'<br \/>\n    AND SP.name NOT IN ('SA')<br \/>\n[\/sql]\n<\/div>\n<h3>sys.server_principals and sys.sql_logins<\/h3>\n<p>\nThe actual list of logins is stored in the <span class=\"tt\">sys.server_principals<\/span> catalog view. We also need to join to <span class=\"tt\">sys.sql_logins<\/span> to get the hashed password. Both catalog views contain the <span class=\"tt\">principal_id<\/span> column, so we can use that to join the two together:\n<\/p>\n<div>\n[sql]\nFROM sys.server_principals AS SP<br \/>\nLEFT JOIN sys.sql_logins AS SL<br \/>\n  ON SP.principal_id = SL.principal_id<br \/>\n[\/sql]\n<\/div>\n<h3>Scripting the Password<\/h3>\n<p>\nFor logins of type SQL_LOGIN we need to specify the hashed password, for the other ones we need to add the <span class=\"tt\">FROM WINDOWS<\/span> clause to the <span class=\"tt\">CREATE LOGIN<\/span> statement. The type of login is accessible in the <span class=\"tt\">SP.type_desc<\/span> column that we have used in the <span class=\"tt\">WHERE<\/span> clause already, so we can just use it again in a <span class=\"tt\">CASE<\/span> statement like this:\n<\/p>\n<div>\n[sql]\nCASE WHEN SP.type_desc = 'SQL_LOGIN'<br \/>\n     THEN ' WITH PASSWORD = '+CONVERT(NVARCHAR(MAX),SL.password_hash,1)+' HASHED'<br \/>\n     ELSE ' FROM WINDOWS'<br \/>\nEND<br \/>\n[\/sql]\n<\/div>\n<p><h3>The final Query<\/h3>\n<\/p>\n<p>\nThat are all the important pieces and we are ready to put them all together:\n<\/p>\n<div>\n[sql]\nSELECT 'IF(SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL)BEGIN CREATE LOGIN '+QUOTENAME(SP.name)+<br \/>\n       CASE WHEN SP.type_desc = 'SQL_LOGIN'<br \/>\n            THEN ' WITH PASSWORD = '+CONVERT(NVARCHAR(MAX),SL.password_hash,1)+' HASHED'<br \/>\n            ELSE ' FROM WINDOWS'<br \/>\n       END + ';\/*'+SP.type_desc+'*\/ END;'<br \/>\n       COLLATE SQL_Latin1_General_CP1_CI_AS<br \/>\n  FROM sys.server_principals AS SP<br \/>\n  LEFT JOIN sys.sql_logins AS SL<br \/>\n    ON SP.principal_id = SL.principal_id<br \/>\n WHERE SP.type_desc IN ('SQL_LOGIN','WINDOWS_GROUP','WINDOWS_LOGIN')<br \/>\n   AND SP.name NOT LIKE '##%##'<br \/>\n   AND SP.name NOT IN ('SA');<br \/>\n[\/sql]\n<\/div>\n<p>\nWhen you run this query, you will get an output like this one:\n<\/p>\n<p>\n<a href=\"http:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg\" alt=\"scripting all logins\" title=\"scripting all logins\" width=\"836\" height=\"568\" class=\"aligncenter size-full wp-image-2350\" srcset=\"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg 836w, https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins-300x203.jpg 300w, https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins-150x101.jpg 150w\" sizes=\"auto, (max-width: 836px) 100vw, 836px\" \/><\/a>\n<\/p>\n<p>\nYou might have noticed a few minor tweaks that I applied to the statement: I made sure the login name is quoted by using the <span class=\"tt\">QUOTENAME<\/span> function. I also added a comment that informs us about the type of the login. Finally, on some SQL Server instances this statement leads to a collation conflict. To prevent that, I added a <span class=\"tt\">COLLATE<\/span> clause.\n<\/p>\n<h3>Final Thoughts<\/h3>\n<p>\nThere are still a few ways to improve this query. For example, server permissions as well as membership in fixed server roles are not scripted by this statement. The statement also ignores the check password and expiration policy settings as well as the default database. However, I am going to leave those additions to be tackled at a later time.\n<\/p>\n<p>\nHappy scripting.\n<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p> Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test or development environment. Read on to see an example query for just this purpose.<\/p>\n<p> <a href=\"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/\">[more&#8230;]<\/a><\/p>\n","protected":false},"author":3,"featured_media":2350,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[5,124,34],"tags":[164,38,58,56,156,15],"class_list":["post-2349","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general","category-queries","category-security","tag-scripting","tag-security-2","tag-security-management","tag-server-principals","tag-sql-login","tag-sql-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Scripting All Logins on a SQL Server Instance - sqlity.net<\/title>\n<meta name=\"description\" content=\"Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test environment. Read on to see an example query for just this purpose.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Scripting All Logins on a SQL Server Instance - sqlity.net\" \/>\n<meta property=\"og:description\" content=\"Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test environment. Read on to see an example query for just this purpose.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/\" \/>\n<meta property=\"og:site_name\" content=\"sqlity.net\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/sqlity.net\" \/>\n<meta property=\"article:published_time\" content=\"2014-04-14T15:00:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-11-13T17:30:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"836\" \/>\n\t<meta property=\"og:image:height\" content=\"568\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sebastian Meine\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@sqlity\" \/>\n<meta name=\"twitter:site\" content=\"@sqlity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Meine\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/\"},\"author\":{\"name\":\"Sebastian Meine\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/#\\\/schema\\\/person\\\/bcffd8c572bc2f1bd10fdba80135e53c\"},\"headline\":\"Scripting All Logins on a SQL Server Instance\",\"datePublished\":\"2014-04-14T15:00:07+00:00\",\"dateModified\":\"2014-11-13T17:30:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/\"},\"wordCount\":845,\"commentCount\":6,\"image\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sqlity.net\\\/wp-content\\\/uploads\\\/2014\\\/04\\\/scripting_all_logins.jpg\",\"keywords\":[\"scripting\",\"security\",\"security management\",\"server principals\",\"SQL Login\",\"SQL Server\"],\"articleSection\":[\"General\",\"Queries\",\"Security\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/\",\"url\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/\",\"name\":\"Scripting All Logins on a SQL Server Instance - sqlity.net\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sqlity.net\\\/wp-content\\\/uploads\\\/2014\\\/04\\\/scripting_all_logins.jpg\",\"datePublished\":\"2014-04-14T15:00:07+00:00\",\"dateModified\":\"2014-11-13T17:30:21+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/#\\\/schema\\\/person\\\/bcffd8c572bc2f1bd10fdba80135e53c\"},\"description\":\"Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test environment. Read on to see an example query for just this purpose.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#primaryimage\",\"url\":\"https:\\\/\\\/sqlity.net\\\/wp-content\\\/uploads\\\/2014\\\/04\\\/scripting_all_logins.jpg\",\"contentUrl\":\"https:\\\/\\\/sqlity.net\\\/wp-content\\\/uploads\\\/2014\\\/04\\\/scripting_all_logins.jpg\",\"width\":836,\"height\":568,\"caption\":\"scripting all logins\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/2349\\\/scripting-all-logins\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sqlity.net\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Scripting All Logins on a SQL Server Instance\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/sqlity.net\\\/en\\\/\",\"name\":\"sqlity.net\",\"description\":\"Quality for SQL\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sqlity.net\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sqlity.net\\\/en\\\/#\\\/schema\\\/person\\\/bcffd8c572bc2f1bd10fdba80135e53c\",\"name\":\"Sebastian Meine\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4ab0a6d02dd494849a584a2c3c8bc3bdcef1d0aa5f87e98bf905dbdb9ad2ce3a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4ab0a6d02dd494849a584a2c3c8bc3bdcef1d0aa5f87e98bf905dbdb9ad2ce3a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4ab0a6d02dd494849a584a2c3c8bc3bdcef1d0aa5f87e98bf905dbdb9ad2ce3a?s=96&d=mm&r=g\",\"caption\":\"Sebastian Meine\"},\"sameAs\":[\"http:\\\/\\\/sqlity.net\",\"https:\\\/\\\/x.com\\\/sqlity\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Scripting All Logins on a SQL Server Instance - sqlity.net","description":"Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test environment. Read on to see an example query for just this purpose.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/","og_locale":"en_US","og_type":"article","og_title":"Scripting All Logins on a SQL Server Instance - sqlity.net","og_description":"Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test environment. Read on to see an example query for just this purpose.","og_url":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/","og_site_name":"sqlity.net","article_publisher":"https:\/\/www.facebook.com\/sqlity.net","article_published_time":"2014-04-14T15:00:07+00:00","article_modified_time":"2014-11-13T17:30:21+00:00","og_image":[{"width":836,"height":568,"url":"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg","type":"image\/jpeg"}],"author":"Sebastian Meine","twitter_card":"summary_large_image","twitter_creator":"@sqlity","twitter_site":"@sqlity","twitter_misc":{"Written by":"Sebastian Meine","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#article","isPartOf":{"@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/"},"author":{"name":"Sebastian Meine","@id":"https:\/\/sqlity.net\/en\/#\/schema\/person\/bcffd8c572bc2f1bd10fdba80135e53c"},"headline":"Scripting All Logins on a SQL Server Instance","datePublished":"2014-04-14T15:00:07+00:00","dateModified":"2014-11-13T17:30:21+00:00","mainEntityOfPage":{"@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/"},"wordCount":845,"commentCount":6,"image":{"@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#primaryimage"},"thumbnailUrl":"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg","keywords":["scripting","security","security management","server principals","SQL Login","SQL Server"],"articleSection":["General","Queries","Security"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/","url":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/","name":"Scripting All Logins on a SQL Server Instance - sqlity.net","isPartOf":{"@id":"https:\/\/sqlity.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#primaryimage"},"image":{"@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#primaryimage"},"thumbnailUrl":"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg","datePublished":"2014-04-14T15:00:07+00:00","dateModified":"2014-11-13T17:30:21+00:00","author":{"@id":"https:\/\/sqlity.net\/en\/#\/schema\/person\/bcffd8c572bc2f1bd10fdba80135e53c"},"description":"Scripting all logins on a SQL Server instance can be helpful e.g. when setting up a test environment. Read on to see an example query for just this purpose.","breadcrumb":{"@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#primaryimage","url":"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg","contentUrl":"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg","width":836,"height":568,"caption":"scripting all logins"},{"@type":"BreadcrumbList","@id":"https:\/\/sqlity.net\/en\/2349\/scripting-all-logins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sqlity.net\/en\/"},{"@type":"ListItem","position":2,"name":"Scripting All Logins on a SQL Server Instance"}]},{"@type":"WebSite","@id":"https:\/\/sqlity.net\/en\/#website","url":"https:\/\/sqlity.net\/en\/","name":"sqlity.net","description":"Quality for SQL","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sqlity.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/sqlity.net\/en\/#\/schema\/person\/bcffd8c572bc2f1bd10fdba80135e53c","name":"Sebastian Meine","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4ab0a6d02dd494849a584a2c3c8bc3bdcef1d0aa5f87e98bf905dbdb9ad2ce3a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/4ab0a6d02dd494849a584a2c3c8bc3bdcef1d0aa5f87e98bf905dbdb9ad2ce3a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4ab0a6d02dd494849a584a2c3c8bc3bdcef1d0aa5f87e98bf905dbdb9ad2ce3a?s=96&d=mm&r=g","caption":"Sebastian Meine"},"sameAs":["http:\/\/sqlity.net","https:\/\/x.com\/sqlity"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/sqlity.net\/wp-content\/uploads\/2014\/04\/scripting_all_logins.jpg","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2wXuw-BT","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/posts\/2349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/comments?post=2349"}],"version-history":[{"count":0,"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/posts\/2349\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/media\/2350"}],"wp:attachment":[{"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/media?parent=2349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/categories?post=2349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sqlity.net\/en\/wp-json\/wp\/v2\/tags?post=2349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}