When re-created an AD user or group permission is not working


SharePoint 내 AD 의 도메인 그룹 혹은 사용자를 추가한 상태에서 해당 object 를 삭제하고 동일한 ID 로 다시 생성한 경우 접근을 할 수 없음

[점검 내역]

  1. 조직 구성
    1. TestOU1
      1. TestOU1_Sub1
        1. TestOU1_Sub1_User1
        2. TestOU1_Sub1_User2
      2. TestOU1_Sub2
        1. TestOU1_Sub2_User1
        2. TestOU1_Sub2_User2
      3. TestOU1_User1
      4. TestOU1_User2
    2. TestOU2
      1. TestOU2_User1
      2. TestOU2_User2
  2. 사이트 구성
    1. extranet.spnote.com
      - TestOU1, TestOU2 도메인 그룹에 읽기 권한 추가
      1. TeamSite_OU1
        - TestOU1 도메인 그룹에 읽기 권한 추가
      2. TeamSite_OU2
        - TestOU2 도메인 그룹에 읽기 권한 추가
  3. 테스트
    1. 사용자 이동
      - 그룹: TestOU1_User2 를 TestOU2 로 이동 (정상 동작)
      - OU 만 이동 시 권한의 변화 없음 (그룹 간 이동이 아님)
      1. 이동 전
      2. 이동 후
    2. 사용자 삭제: TestOU1_User2
      - 재 인증 요청함
    3. 사용자만 다시 추가: TestOU1_User2
      - 인증은 했으나 Access Denied 됨
      - TestOU1 그룹에 TestOU1_User2 추가 (정상 동작)
    4. TestOU1 그룹 삭제
      - 접근 불가
    5. TestOU1 그룹 재 생성, 사용자 멤버 재 구성 후에도 접근 불가
      - 브라우저 재 시작해도 접근 불가
      - IIS 에서 App Recycle, Reset 해도 접근 불가

      - User Profile compile 은 VM 에 구성되지 않아서 테스트 불가 (과거 운영에서 시도 시 되지 않았음)
      - The User Profile Replication Engine will not replicate distribution lists or security groups,
      but it will replicate site memberships (for example, My Sites)

      - 관리자로 로그인하여 사이트 접근 권한 확인 시 접근 불가 상태 확인


SharePoint 에서는 동일한 ID 의 계정이지만 내부에서 관리하는 SID(Security Identifier) 가 다르므로 다른 권한으로 인식하여 Object 가 다시 추가되더라도 접근을 할 수 없는 현상.


  1. Migration 처리
    - AD Groups cannot be used to assign permissions in SharePoint
    - 재 생성된 사용자 혹은 그룹의 Migration 처리

    - SharePoint 내부 DB 에서 Guid 필드값이 업데이트 됨
  2. 이후 정상 접속됨



[참고] 상세 테스트
- Domain Group, Domain Group 내
사용자, 직접 추가된 사용자 삭제

  1. 그룹 권한(TestOU1_Sub2)  삭제
    1. (#1) 그룹 권한(TestOU1_Sub2) 추가 시 레코드 추가됨
      - Domain Group 일 경우 Token 필드에, 그룹 내 사용자는 ExternalToken, ExternalTokenLastUpdated 필드에 값이 있음
    2. (#2) 그룹 내 사용자가 최초 로그인 시 레코드 추가됨
      -  TestOU1_Sub2_User2
    3. (#1) TestOU1_Sub2 그룹 삭제 시
      - TestOU1_Sub2_User2 접근 불가
      - DB 값 변화 없음
    4. (#1) TestOU1_Sub2 그룹 재 생성, 멤버 구성
      - 변화 없음 (3번과 동일함)
    5. Group Migration
      - SystemID 변경 됨
    6. 정상 로그인 됨
  2. 그룹 권한(TestOU1_Sub2)  내의 AD 계정(TestOU1_Sub2_User2) 삭제
    - 변화 없음
    1. 페이지 접속 시 인증창 나타남
      - DB 값 변화 없음
    2. AD Object 재 생성 및 TestOU1_Sub2 그룹에 멤버로 추가
    3. 정상 로그인 됨
      - SharePoint 에 추가된 그룹 내 사용자는 Migration 하지 않아도 재 인식
      - 사용자는 SharePoint 에 직접 추가된 것이 아님
    4. 기존 레코드의 tp_Deleted, tp_ExternalToken, ExternalTokenLastUpdated 값 변경되고 신규 레코드가 추가됨
  3. AD User (SID_Test2, 3) 삭제
    - TeamSite4 의 Members 그룹에 SID_Test2, SID_Test3 사용자 추가
    - SID_Test2 는 삭제, SID_Test3 는 삭제 후 재 생성하고 MigrateUser 수행

    1. 두 계정 로그인 후
    2. 두 계정 삭제 후
      - 접속 시 인증창 나타남
      - DB 변화 없음
    3. AD User(SID_Test3) 만 다시 생성
      - 사이트 접속 시 Access Denied
    4. User migration
      1. SID_Test2
        - 사용자 존재하지 않거나 유일하지 않다고 표시됨

        - 접속 시 인증창 나타남
      2. SID_Test3
        - 정상 적용됨

        - 정상 로그인
      3. SharePoint 권한: 변화 없음

Change Web Application Service Account

Configurations for changing a Web Application account are needed at many different locations including System, IIS, and Database. If you just changed an Application Pool identity directly from IIS, you may get an error message of “Cannot Connect to the configuration database.” So, I recommend you to use the method that SharePoint provides and will describe what SharePoint does when applying it.

How to change to a new account (SPNOTE\SP_PortalApp2) and what happened after applying it.

  1. Create a new account
    ex) SPNOTE\SP_PortalApp2 (current: SP_PortalApp)
    1. Create an account as a domain user
  2. Register the account as managed account and configure it for a Web Application Pool
    1. Move to Central Admin > Security > Configure managed accounts
      - Register as managed account
    2. Move to Central Admin > Security > Configure service accounts
    3. Select a Web Application Pool and the new account (SP_PortalApp2)
    4. Click OK
      - When you click OK, you will see this message. You should run “IISRESET /NOFORCE” on all servers in the farm. Application Pool for each Web App is changed automatically though. Refer to 3.3)
  3. What has happened after applying it?
    - SharePoint automates various configurations to the System, IIS, and SQL Server
    1. The user has added into three groups
      - IIS_IUSRS, Performance Monitor Users, WSS_WPG
    2. Application Pool Identity has changed
    3. The Application Pool is recycled
    4. The user has added to related SharePoint databases (For my environment)
      - Owners: ProfileDB , SocialDB, SyncDB, WSS_Content_Intranet
      - WSS_Content_Application_Pools: SharePoint_AdminContent, SharePoint_Config, StateService
      # ex) WSS_Content_Intranet (http://intranet.spnote.dev)
      * When you change the service account to another one ex) SP_PortalAppNew and delete from Managed Accounts, the SP_PortalApp2 still exists in WSS_Content_Intranet Database. This means SharePoint doesn’t delete the user(SP_PortalApp2) from the Database automatically.
  4. Access to the site (http://intranet.spnote.dev)
    1. I faced the error “Cannot Connect to the configuration database.”
      - At this time I didn’t run the IISRESET and you may notice all credentials must be updated. If you have multiple servers in a farm, then this PowerShell script may help you.
    2. Run the IISRESET /NOFORCE
    3. Access again
      - Fill account information
      - It works fine

Set Email Notification values on a UserProfile

In OOTB SharePoint 2010, all the three options for Email Notifications are checked. This may help customers for collaboration but some others may think that they receive lots of unnecessary emails and get annoyed. If your company size is big enough like me (30,000+), your IT department manager will make a request for disabling all or some of them.

The request was to disable the last option.

  • Uncheck “Send me suggestions for new colleagues and keywords”

After searching on this, I found out that there is a nice one using PowerShell but I couldn’t find the how the option value is saved because the value has changed to a different value when I save it into the UserProfile. In addition, I wanted to add some features such as examining values, applying multiple sites and saving some information into a log file.

The simple application looks like below.

At first, I thought updating the options for the UserProfile should be easy but if you tried some combinations, you will realize saved values are somehow different than the value should be.

You may think the option value will be saved like this
[V] Notify me when someone leaves a note on my profile
[V] Notify me when someone adds me as a colleague
[   ] Send me suggestions for new colleagues and keywords
=> option  value: 110

# Binary and Decimal values

Surprisingly, you will notice the Email Notification setting value is 100 (SP) instead of 110 (UI) when you read it from SharePoint. I could figure out after trying several times with combinations

Now I am going to explain how the value is saved.

  1. Without conversions – think the other way
    1. Checked: 0, Unchecked: 1
    2. Concatenate the option values in opposite order
      - Concatenate them in descending order (from 3 to 1)
  2. Convert UI one (110) to SharePoint one (100)
    1. Reverse the each options
    2. Reverse characters

The option value 110 (UI Version) is saved into 100 (SP Version) and I have no idea why the developer is saved it this way. You may find a method for doing this from SharePoint dlls(Please let me know if you find it).

Some tips from my exprience are

  1. SPSEmailOptins value is null (default)
    - The value null means 111 (all of them will be checked)
    - Check the value is null when you read the value
      You can read the value once you saved it.
  2. Login as farm administrator account
    - you can add another account at UserProfileServiceApplication > Administrators for testing.
  3. Check if user exists from UserProfileManager
    - UserProfileManager.UserExists(accountName)

I had a hard time configuring My Site and testing this app. My Site configuration was hard and took some time. I will write an article about it later.

Install Windows Live Writer 2012 for BlogEngine

Come back to blogging again!!! The first thing I need to do is installing the Live Writer. The main reason I do it is for editing contents and inserting images easily.

One thing you should remember is that the address of “Remote posting web address for your blog” and the value sample is http://YourBlog/metaweblog.axd. Refer to Metaweblog API if you want to see the details.

Steps are below.

  1. What blog service do you use?
  2. Add a blog account 
  3. Select blog type 
    ex) http://www.spnote.com/metaweblog.axd
    You can access with the URL and check it’s working
  4. Select blog 
  5. Setting up your blog account
  6. Download Blog Theme
    - I clicked OK
  7. Set my blog nickname 
  8. Now you’ve finished and ready to post

.NET vs Windows 8

아침 출근하다 읽은 기사입니다.

.NET vs Windows 8 에 대한 개발자 경험과 생각입니다.
다행히도 .NET 개발자가 죽지는 않겠다는 것 같습니다.
Metro App 들이 얼마나 성황될지는 모르지만 HTML5 + JavaScript 는 새로운 주류가 될 것 같습니다.

인상적인 부분은 마지막 답글에서 Windows Mobile 이후 WP7 이 나올때 legacy support 가 없으면 개발자가 다치고 승질나서 떠나갈 수도 있다는 것을 MS 도 알거라는 내용이 있습니다.

딱히 개인소개 페이지가 없어서 어떠신 분인가 확인이 되지 않는 찰나에 Archives 에서 Inside Red Gate 가 보여서 들어가보았는데 Red Gate 에서 일하시는 분이 맞네요~(공신력 상승) DB 나 .NET 관련 툴 제작 회사이나 Reflector 를 산 회사로 많이? 알려졌습니다. 어디선가 일하기 좋은 100 대 기업에 속했다고 본 기억이 납니다. (아마도 영국내~ 그래도 부럽~~) 하지만, Reflector 의 유료화로 인해 개발자들이 기분이 좀 안 좋은 것 같습니다.

Cloud 전환 예(Netflix)

오늘 아침 본 기사인데, Netflix 라는 회사가 Cloud 로 전환하면서
겪게되는 이야기인 것 같습니다. (저도 출근 중에 읽어서 먼 소린지 잘 모름 ^^)
개발자 출신이 CEO 이고 임원들도 엔지니어들이다 보니 CIO 가 딱히 없다고 하네요~

기억나는 것은 아래와 같습니다.
1.    Hardware 부분은 Cloud 로
- 필요없어진 운영 인력을 절약?하는 무언가를 말하는 것 같음
2.    기존 DB 도 Cloud 로 (처음엔 아마존의 SimpleDB 이젠 아파치의 카산드라)
- 카산드라 전문가가 기존의 스키마를 어떻게 적용해야할지 개발자에게 가르쳐준다는 듯…
3.    Cloud 로 변화하면서 겪는 고통과 해결?

시스템이 다르다보니(Not windows) 읽기가 쉽지 않은 것 같습니다.
고유한 단어들도 보이고… 여튼, 시간날때 사전 준비하시고 읽어보세요~

The last free version of .NET Reflector (Ver 6.8)

Finally I got a free Reflector Ver 6 after I register with a key from Red-Gate. The redgate posted a message that It will not expire or force you to update for this version. I've used it for around one month and I haven’t got any disturbing messages yet.

You can register by using the link on the Disassembler window or help menu. You will get received an email with a serial key as soon as you register it. (This serial key can be used to active up to 5 machines.)

Unfortunately there is no separate download link for this version. Only available to existing users of the free edition and the update mechanism will update to the 6.8 version. I cannot guarantee you all things work well so your reflector may be upgrated to version 7.

I sent the my reflector folder(contains files) (Ver 6.8) to one of my colleagues and she executed it then activation / registration window popped up so she could register using the register button. Look for the version 6.8 near around you then you will get the last free version.

Visual Studio Regular Expression

최근 Cross Browser 의 요구에 따른 작업을 하던 중 IE 가 아닌 타 브라우저 처리를 위한 작업을 하던 중 페이지 내에서 특정 태그와 그 내용을 지워야하는 상황이 발생했었습니다. 사실 한두개 바꾸는 거라면 다른 옵션은 신경도 쓸 필요가 없겠지만, 약 100 개의 페이지 정도 되는 상황이라면 무언가 이 단순한 작업을 처리해 줄 도구들을 찾기 마련입니다.

이 작업을 해소하기 위해 Visual Studio 에서도 Find and Replace 메뉴에서 정규 표현식 사용하면 되겠거니 하면 후회하실 수도 있습니다. 그 이유는 여기서 사용하는 정규 표현식은 일반적인 것과는 다릅니다. 물론, 아래의 참고 링크들을 숙지하고 정규 표현식에 지식이 조금 있는 분이시면 VS 의 OOTB 로 해결하면 됩니다. 저는 이런 상황에 직면할때마다 기왕이면 시간 좀 들여서 좀 더 세련된 방법이나 좋은 방법을 배우고 적용하고 싶지만 여유를 주지 않는 업무 환경이 처리를 단순하게 하는 것 같아 안타깝습니다. 사실, VS 보다는 Office 를 주로 켤때면 암울합니다.

VS IDE Regular Expressions 와 Standard  regex 와의 비교입니다.
(codinghorror.com 에서 가져옴 – 원문 링크)

  Visual Studio IDE Standard
Any single character . .
Zero or more * *
One or more + +
Beginning of line ^ ^
End of line $ $
Beginning of word < (no equivalent)
End of word > (no equivalent)
Line break \n \n
Any character in set [ ] [ ]
Any character not in set [^ ] [^ ]
Or | |
Escape special char \ \
Tag expression { } ( )
C/C++ identifier :i ([a-zA-Z_$][a-zA-Z0-9_$]*)
Quoted string :q (("[^"]*")|('[^']*'))
Space or Tab :b [ |\t]
Integer :z [0-9]+

어쨌든, aspx 페이지의 내의 object 태그를 없애는데 손쉽게 사용할 수 있는 것들을 찾아보던 중 VS 에 AddIn 되는 것과 Application 의 형태로 판매되는 것들이 있는 것을 확인했습니다. 우선 공짜이기도 하지만 VS 의 Find and Replace 처럼 수정된 내용도 Editor 내에서 볼 수 있고 원하는대로 수정을 할 수 있는 RegExAddin 을 사용하기로 했습니다. 
  - Link: .NET Regular Expressions Find and Replace Add-In for Visual Studio 2008 (VS 2010 은 아직 없음)
  - For VS 2003: Standard Regular Expression Searcher Addin For VS.NET 2003

# 사용 예 (object 태그 제거, 잘 변경되었는지 보기 위해 열어놓기 체크)

파일이 아닌 TEXT 작업을 위해서는 Expresso 를, 파일 수정 및 좀 더 다양한 작업을 위해서는 RegexBuddy(상용: $39.95) 를 추천합니다. 저는 공짜인 Expresso 를 사용합니다.

# RegexBuddy Screenshot
- 상용이라서 그런지 꽤 좋아 보입니다.

# Expresso Screenshot

평소에는 정규 표현식과 친근하지는 않지만 문자열 처리 등에서는 아주 효율적이라고 생각하기에 공부의 필요성은 느끼지만 안타깝게도 책은 책꽂이에 모셔두고 있습니다. (혹시 정규 표현식을 잘 쓰시는 분이 계시만 친하게 지내고 싶습니다. )

SharePoint 2010 이 Deploy 되면 Delegate Control 을 잘 활용하면 되겠지만, 타 시스템(게시나 결재) 등에서도 활용할 수 있는 컨트롤을 제작하는 것도 좋을 것 같습니다.

[참고 링크]
1. VS 의 Find and Replace 의 Regular Expression 초보 팁 1
2. VS 의 Find and Replace 의 Regular Expression 초보 팁 2
3. VS 의 Find and Replace 의 Regular Expression 초보 팁 3
4. 정규 표현식 추천 책

My SharePoint 2010 books

Two month ago, I requested buying three SharePoint 2010 books to my company and I could get one of them today and it is Professional SharePoint 2010 Administration. As a SharePoint Developer + Administrator, I need to handle admin stuff as well. In SPS 2003, the main admin jobs are setting IIS and watching logs. I expect it will be much harder and need to study more on SharPoint 2010 administration.

Even though I could download many white papers and documents from Microsoft but they are too plenty and I can't get the general or wide categories with easy access like reference books on my shelf. So I'm happy for it and two books are coming up soon.

The three books I've chosen are below

Book Image Description

Inside Microsoft SharePoint 2010 by Ted Pattison, Andrew Connell, Scot Hillier and David Mann

Developer book. I'm fan of Ted since the book Inside Microsoft Windows SharePoint Services 3.0 which I learned so much from the book when I developed on MOSS 2007.

Professional SharePoint 2010 Administration by Todd Klindt, Shane Young and Steve Caravajal

Admin book. I should read all and study it with Powershell. I also owned Windows Powershell in Action.

Microsoft SharePoint 2010 End User Guide: Business Performance Enhancement by Peter Ward and Michael McCabe

End user book. One of my tasks is showing users how to use SharePoint well and make them collaborate with team members and colleagues. When I was a completely developer, I could only see the developer perpective that I made applications without considering users. Fow now, I found out the Great application must be designed for users first!!! Anyways, I should understand many features of SharePoint and give them its full fuctionality and empower their daily businnes more easily with SharePoint.

I'll put notes as I read and study them.


NET Reflector is not free after all!!!

SharePoint 2007 개발과 .NET 개발 시에 아주 잘 사용했던 Reflector 가 드디어 유료로 바뀌었습니다.
Lutz Roeder 신께서 공짜로 제공하는 때가 정말 행복한 시절임을 새삼 깨닫습니다.
공짜로 쓰던 것을 돈주고 사서 쓰려면 왠지 쓰고 싶지 않은 마음을 왜 그럴까요?

첫번째 .NET 어셈블리 브라우저인 .NET Reflector 와 2002 년부터 Microsoft Expression 을 하고 계신 Lutz Roeder 님을 다시한번 생각해 봅니다.
  - .NET Reflector
  - Lutz Roeder Site

# Expiration message (May 30)

새로운 가격에 대한 내용은 아래의 링크에서 확인이 가능합니다.

 # Minimum $35


이제 공짜로 즐길 수 있는 App 은 JustDecompile 이 남았습니다.
.NET Framework 4.0 설치를 해야하고 아직 Beta 버전이라서 버그도 많지만,
Reflector 수준으로 하루빨리 성장하기를 기대해봅니다.