which country user step here?

Tag Cloud

MOSS (47) SharePoint 2007 (37) SharePoint 2013 (31) SharePoint 2010 (23) MOSS admin (17) PowerShell (17) admin (17) developer (16) List (15) WSS (14) sql query (14) MOSS SP2 (13) end user (11) scripting (11) wss V3 (11) permission (10) sql (9) Moss issue (8) search (8) database (7) RBS (6) Service Pack (6) reportadmin (6) workflow (6) CU (5) Excel (5) Patch (5) client object model (5) Client Code (4) Command (4) Cumulative Updates (4) IIS (4) SharePoint 2019 (4) SharePoint designer (4) office 365 (4) stsadm (4) user porfile (4) ASP.NET (3) Content Database (3) Groove (3) Host Named Site Collections (HNSC) (3) SharePoint 2016 (3) Tutorial (3) alert (3) authentication (3) batch file (3) codeplex (3) domain (3) error (3) incomming email (3) issue (3) restore (3) upload (3) Caching (2) DocAve 6 (2) Folder (2) Index (2) Internet (2) My Site Cleanup Job (2) My Sites (2) News (2) People Picker (2) Share Document (2) SharePoint admin (2) View (2) Web Development with ASP.NET (2) add user (2) audit (2) coding (2) column (2) deploy solution (2) download (2) enumsites (2) exam (2) export (2) june CU (2) load balance (2) mySites (2) network (2) orphan site (2) performance (2) profile (2) project server (2) query (2) security (2) server admin (2) theme (2) timer job (2) training (2) web master (2) web.config (2) wsp (2) 70-346 (1) 70-630 (1) AAM (1) Anonymous (1) Approval (1) AvePoint (1) Cerificate (1) Consultants (1) Content Deployment (1) Content Type (1) DOS (1) Document Library (1) Drive Sapce (1) Excel Services (1) Export to Excel (1) Feature (1) GAC (1) Get-SPContentDatabase (1) Get-WmiObject (1) HTML calculated column (1) ISA2006 (1) IT Knowledge (1) ITIL (1) Install (1) Link (1) MCTS (1) Macro (1) Masking (1) Migration (1) NLBS (1) Nintex (1) Office (1) Open with Explorer (1) ROIScan.vbs (1) Reporting Services (1) SPDisposeCheck.exe (1) SQL Instance name (1) SSRS (1) Sandbox (1) SharePoint Online (1) SharePoint farm (1) Shared Services Administration (1) Site Collection Owner (1) Site template (1) Skype for business (1) Steelhead (1) Teams (1) URLSCAN (1) VLOOKUP (1) WSS SP2 (1) XCOPY (1) abnormal incident (1) admi (1) app (1) application pool (1) aspx (1) availabilty (1) backup (1) binding (1) blob (1) branding sharepoint (1) cache (1) calendar (1) change password (1) connection (1) copy file (1) counter (1) crawl (1) custom list (1) domain security group (1) event (1) excel 2013 (1) facebook (1) filter (1) fun (1) group (1) iis log (1) import (1) import list (1) improment (1) interview (1) keberos (1) licensing (1) log in (1) metada (1) migrate (1) mossrap (1) notepad++ (1) onedrive for business (1) operation (1) owa (1) process (1) publishing feature (1) resource (1) send email (1) size (1) sps2003 (1) sql201 (1) sql2012 (1) sub sites (1) system (1) table (1) task list (1) today date (1) trial (1) vbs (1) video (1) web part (1) web server (1) widget (1) windows 2008 (1) windows 2012 R2 (1) windows Azura (1) windows account (1) windows2012 (1) wmi (1)

Thursday, October 26, 2023

篇文章探讨了SharePoint中的一个问题,即用户随机失去权限或被从站点中删除的问题。

链接中的文章标题是"SharePoint: Users randomly lose permission – are deleted from site",这篇文章探讨了SharePoint中的一个问题,即用户随机失去权限或被从站点中删除的问题。作者解释了该问题的原因和解决方法。这篇文章提供了详细的信息,包括SQL查询和PowerShell脚本,以帮助管理员识别和解决此问题。文章还提到了如何避免出现这个问题。如果您想详细了解这个问题和解决方法,请点击链接查看完整的文章:SharePoint: Users randomly lose permission – are deleted from site。

章标题: SharePoint: Users randomly lose permission – are deleted from site

作者: Josh Roark

发布日期: 2018年12月30日

更新日期: 2022年11月16日


文章内容:

这是一个复杂的问题。它似乎是随机和不定期的(实际上都不是),并且非常难以跟踪。这被称为“SID不匹配”问题。

这个问题的一个场景如下:

Intermittently, when a user browses to a resource (site, list, etc) that they are supposed to have access to, they receive “Access Denied“, or our friendlier version: “Sorry, this site hasn’t been shared with you“.

When looking at permissions, you find that the user no longer has any explicitly-given permission within the site collection.

The permission to the resource has been removed and the user must be added back. In fact, the user has been deleted from the entire site collection. The only permissions they may have left are those they get via Active Directory (AD) group membership.

You may find entries like the following in your SharePoint ULS logs at the time the user lost permission:

Failed to add [Login=i:0#.w|contoso\user1] to the database. It may already exist at [SiteId=5F39AB50-AD42-4B35-85E3-3BDF60028A7B][UserId=0]. HR=0x80070050

Found a user with the same tp_Login but different tp_SystemId. Try to delete it. Site ID: 5F39AB50-AD42-4B35-85E3-3BDF60028A7B tp_Login: i:0#.w|contoso\user1

不定期地,当用户浏览到他们应该有访问权限的资源(站点、列表等)时,他们会收到“拒绝访问”或更友好的版本:“抱歉,此站点尚未与您共享”。

在查看权限时,您会发现用户不再在站点集合中具有任何明确授予的权限。

资源的访问权限已被删除,用户必须重新添加。实际上,用户已从整个站点集合中删除。他们可能仅通过Active Directory(AD)组成员身份获得的权限仍然存在。

在用户失去权限的时间,您的SharePoint ULS日志中可能会出现以下类似的条目:

Failed to add [Login=i:0#.w|contoso\user1] to the database. It may already exist at [SiteId=5F39AB50-AD42-4B35-85E3-3BDF60028A7B][UserId=0]. HR=0x80070050

Found a user with the same tp_Login but different tp_SystemId. Try to delete it. Site ID: 5F39AB50-AD42-4B35-85E3-3BDF60028A7B tp_Login: i:0#.w|contoso\user1

原因:

在某个时候,用户通过用户配置文件同步(Profile Sync)导入,然后从Active Directory(AD)中删除,再次在Active Directory中使用相同的帐户名重新创建,并随后重新通过Profile Sync导入。当以这种方式重新在AD中创建用户时,他们具有相同的帐户名,但具有新的安全标识符(SID)值。当用户被重新导入到SharePoint时,它们的SID未在Profile数据库中的UserProfile_Full表中更新。现在,用户配置文件服务应用程序(UPA)中的SID与站点集合使用的UserInfo表中的SID不匹配。

Verify you're hitting this issue:


您可以运行以下SQL查询来识别处于此状态的用户。以下是根据不同版本的SharePoint运行的查询示例。
SharePoint 2016+查询:
sql
-- 识别在UserProfile_Full和UserProfileValue之间SID不匹配的配置文件: -- SharePoint 2016及更高版本 select upf.RecordId, upf.NTName, upf.PreferredName, upv.PropertyVal as [SIDfromUserProfileValue], pl.PropertyName, upv.PropertyID into #temp from upa.UserProfile_Full upf (nolock) join upa.UserProfileValue upv (nolock)on upf.RecordID = upv.RecordID join upa.PropertyList pl (nolock) on pl.PropertyID = upv.PropertyID where upv.propertyid = 2 select upf.RecordId, upf.NTName, upf.PreferredName, upf.SID as [SIDfromUserProfile_Full], #temp.SIDfromUserProfileValue from upa.UserProfile_Full upf (nolock) join #temp on upf.RecordID = #temp.recordid where upf.SID != #temp.SIDfromUserProfileValue drop table #temp
SharePoint 2013查询:
sql
-- 识别在UserProfile_Full和UserProfileValue之间SID不匹配的配置文件: -- SharePoint 2013版本 select upf.RecordId, upf.NTName, upf.PreferredName, upv.PropertyVal as [SIDfromUserProfileValue], pl.PropertyName, upv.PropertyID into #temp from UserProfile_Full upf (nolock) join UserProfileValue upv (nolock)on upf.RecordID = upv.RecordID join PropertyList pl (nolock) on pl.PropertyID = upv.PropertyID where upv.propertyid = 2 select upf.RecordId, upf.NTName, upf.PreferredName, upf.SID as [SIDfromUserProfile_Full], #temp.SIDfromUserProfileValue from UserProfile_Full upf (nolock) join #temp on upf.RecordID = #temp.recordid where upf.SID != #temp.SIDfromUserProfileValue drop table #temp
这些查询将帮助您识别在UserProfile_Full和UserProfileValue之间SID不匹配的用户。
您在查询结果中列出的用户将与遇到此随机权限丧失问题的用户匹配,其中可能包括一些您不了解的用户。

注意: 结果中列出的SIDs已经进行了编码。您需要使用一些PowerShell来将它们解码为熟悉的"S-1-..."格式,但这对我们的目的来说并不必要。主要目的是识别它们是不同的。

另一个线索是这些问题用户将在内容数据库的UserInfo表中具有多个记录,每个记录的tp_systemID(即其编码的SID)都不同。其中一个将被标记为已删除 (tp_deleted > 0)。

通过运行以下SQL查询,您可以验证这一点:
sql
select * from userinfo (nolock) where tp_login like '%YourUsersNameHere%' and tp_siteid = 'YourSiteCollectionIDHere'
例如:
sql
select * from userinfo (nolock) where tp_login like '%josh%' and tp_siteid = '020E1B20-92B7-4CBC-B072-EA9369204350'
如果您不确定站点集合ID,可以运行以下PowerShell命令来获取它:
powershell
(get-spsite http://YourSiteURLHere.contoso.com).id
请注意:同一内容数据库中可以存储多个站点集合,因此在查询中包括站点集合ID非常重要。


如何修复这个问题?

我们需要更新Profile数据库中Profile_Full表中的SID。直接使用SQL更新是不受支持的方法。在受支持的方式中,解决此问题的一种方法是删除所有出现问题的用户配置文件,然后重新导入它们。然而,这些用户将失去所有手动输入的配置文件数据,如“关于我”、“向我提问”、“技能”、“兴趣”等。在大多数情况下,这不是一个好的解决方案。

相反,您可以运行Move-SPUser PowerShell命令,以将Profile_Full表中的SID更新为用户的“好/当前”SID。由于我们将传递相同的帐户名作为“旧”和“新”帐户,SID的值将是用户的唯一净变更。以下是运行此操作以修复单个用户的示例:
powershell
$url = "http://www.contoso.com/" $claimsAcc = "i:0#.w|contoso\user1" $user = Get-SPUser -Identity $claimsAcc -Web $url Move-SPUser -Identity $user -NewAlias $claimsAcc -IgnoreSID

要运行Move-SPUser,您需要以具有User Profile Service Application上的Full Control权限的农场管理员身份登录。如果未这样做,可能会导致Null引用异常:Object reference not set to an instance of an object。

如果有大量处于此状态的用户,您将希望在循环遍历每个用户的脚本中运行此操作。下面是一个示例脚本,它从CSV文件中读取受影响的用户名。

完成这些步骤后,您可以再次运行针对Profile数据库的“识别在UserProfile_Full和UserProfileValue之间SID不匹配的配置文件”SQL查询。如果所有用户都得到了修复,它将不再返回任何结果。

重要提示:

如果您有一个发布/消耗场景,其中有其他农场使用User Profile Service Application,您必须在托管UPA的农场中的服务器上运行Move-SPUser脚本。如果这是一个专用的“服务”农场,您可以临时创建一个Web应用程序和站点集合,以便运行该脚本,或者您可以使用Move-SPUser的较少已知的等效方法:$farm.MigrateUserAccount。示例:
powershell
$farm = Get-SPFarm $farm.MigrateUserAccount("contoso\user1", "contoso\user1", $false)

**关于这个问题的原因的详细信息,如果您感兴趣的话:**

这种SID不匹配的情况引发了一个连锁反应,我会尝试解释一下:

1. 使用Profile Sync / Import导入用户。
2. 在Profile数据库的UserProfile_Full表和UserProfileValue表中创建具有正确SID的记录。在此时,两个表中的SID匹配。一切都很好。
3. 在Active Directory中禁用用户,然后运行完全导入。
4. 假设您选择在导入连接中过滤掉已禁用的用户,他们将成为非导入的配置文件。
5. 删除Active Directory中的用户帐户。
6. 在AD中重新创建用户,使用相同的帐户名(例如:contoso\user1)。
7. 他们将具有相同的帐户名,但具有新的SID。
8. 再次运行Profile Sync / Import。
9. 现有的配置文件记录将在UserProfileValue表中使用新(好的)SID进行更新,但存储在UserProfile_Full中的SID不会更新。它将保留旧(不好的)SID。
10. 现在我们有SID不匹配的情况。
11. 将用户授予对站点、列表、文档等的权限。
12. 它将以新(好的)SID添加到站点权限中。
13. 用户在Office Web Apps中打开文件。
14. Office Web Apps身份验证过程的一部分(OAuth)是调用User Profile Service Application(UPA)以获取有关用户的信息,以增强其声明集并使用它来打开文件。
15. UPA在OAuth令牌中返回旧(不好的)SID。
16. OAuth令牌呈现给SharePoint站点,以尝试打开文档。
17. 授权过程在站点权限中按帐户名查找用户。
18. 由于用户具有相同的帐户名但不同的SID,现有的用户记录将从站点集合中删除,从而删除所有用户权限。
19. 您会看到,SharePoint中SID被视为用户的唯一标识符。帐户名是无关紧要的,如果具有不同的SID,SharePoint会将您视为不同的用户。
20. 由于我们不能在任何给定时间内具有相同帐户名的多个用户,原始用户记录被标记为已删除,所有用户权限都被删除。
21. 这就是用户遇到“拒绝访问”和/或失去所有手动授予的权限,必须重新添加到站点权限的原因。

用户被重新添加到站点权限,使用其正确(好的)SID。这将有效地将其'坏'记录在UserInfo表中标记为已删除,并重新激活其'好'记录。

用户在再次经过OAuth流程之前是正常的。

重要提示:上述示例场景涉及Office Web Apps(OWA),但任何使用OAuth的功能或调用UPA进行声明增强的功能都可能发生类似的情况。这包括(但不限于):Office Web Apps、2013平台工作流、站点邮箱、SharePoint托管应用、提供程序托管应用以及一些自定义声明提供程序。


**示例修复脚本:**

以下是一个示例PowerShell脚本,其中存储在CSV文件中的问题用户帐户名。

**注意:** CSV文件应该有一个名为“NTName”的标头,并且每行上有一个帐户名。可以使用上面“验证您是否遇到了这个问题”的SQL查询的输出来创建这个文件。

输入文件应如下所示:

```
NTName
CONTOSO\VP1
CONTOSO\jack
CONTOSO\VP2
CONTOSO\usera
CONTOSO\userx
CONTOSO\VP3
```

```powershell
############################## -- 脚本 -- ##############################
# 作者: Joroar
# 日期: 2018年9月18日
# 该脚本按原样提供,不附带任何明示或暗示的担保。请备份并谨慎使用。
# 请自行承担风险!
# 简介:使用此脚本来运行 $farm.MigrateUserAccount 对存储在CSV中的帐户名列表执行操作。
# $farm.MigrateUserAccount 是农场范围的操作,因此每个用户只需要运行一次。
# 请设置前两个变量:$path、$logfile
# 您必须以具有User Profile Service Application上的Full Control权限的用户身份运行此操作。
$path = "c:\problemUserProfiles.csv" # 存储有要迁移的用户帐户名的输入文件
$logfile = "c:\MigrateUserAccount-Log.txt" # 输出日志文件
Add-PSSnapin microsoft.sharepoint.powershell -ea SilentlyContinue
$date = Get-Date -Format U
"Started MigrateUserAccount at " + $date + " (UTC time)" | out-file $logfile -append
"===============================================" | out-file $logfile -append
$ErrorActionPreference = "stop"
$csv = Import-Csv -Path $path
[array]$NeedtoFix = @()
$farm = Get-SPFarm
foreach($line in $csv)
{$NeedtoFix += $line}
$fixTotal = $NeedtoFix.Count
for($j=0; $j -lt $fixTotal; $j++)
{
$acc = ""
$acc = $NeedtoFix[$j].ntname
"Fixing user: " + ($j+1) + " out of " + $fixTotal + " --> " + $acc | out-file $logfile -Append
try{
$farm.MigrateUserAccount($acc, $acc, $false) 
write-host "Fixed user: " ($j+1) " out of " $fixTotal " --> " $acc
}
catch [system.Exception]
{"ERROR!!! for user: " + $acc + " -- " + $_.Exception.Message | out-file $logfile -append}
}
############################## -- 脚本 -- ##############################

**避免出现这个问题:**

如果Active Directory管理员不删除并重新创建具有相同帐户名的帐户,那将很好,但可以通过简单地保持用户配置文件清理来避免这种情况。通常,管理员会首先在Active Directory中禁用帐户一段时间,然后再删除它。如果您将已禁用的用户从配置文件导入中筛选出,并定期执行配置文件清理步骤,那么这些无效的用户配置文件将从配置文件数据库中删除。然后,当在AD中重新创建帐户时,它将获得UPA中的全新记录,一切都会很好。

更多关键词:

这些症状可以通过几种不同的方式来解释,我将在这里列出以增加本文的“可发现性”。

- SID不匹配
- 不匹配的SID
- 用户失去访问权限
- 失去权限
- 拒绝访问
- 移除权限
- 访问被拒绝
- 访问被拒绝
- 权限被删除
- 用户被删除

以上内容已经全部翻译完毕。如果您有任何其他问题或需要进一步的翻译,请随时告诉我。


Tuesday, June 8, 2021

SharePoint User profile backend logic

 Recently encounter one very interesting domain authentication failed login scenario , which is current SharePoint server hosted at Domain A then have one way Trust with Domain B.

All the SharePoint service account is under Domain A and the problem is Domain A SharePoint service account keep on go to Domain B triggering the authentication failed .

Check on the ULS log , we have encounter that below informaiton provided during authentication failed at Doman B :

  • SPRequest.GetNTFullNamefromLoginEx: UserPrincipalName=, AppPrincipalName= ,bstrLogin=Domain B\UserABC
  •  System.Runtime.InteropServices.COMException: Cannot complete this action.  Please try again.<nativehr>0x80004005</nativehr><nativestack></nativestack>, StackTrace:    at Microsoft.SharePoint.Utilities.SPUtility.GetFullNameFromLoginEx(String loginName, Boolean& bIsDL)     at Microsoft.SharePoint.SPSecurity.ResolveUser(String userName, String& displayName, Byte[]& sidBytes)     at Microsoft.SharePoint.Administration.SPAcl`1.CreateAce(String principalName, T grantRightsMask, T denyRightsMask)     at Microsoft.Office.Server.Administration.UserProfileApplication.get_SerializedAdministratorAcl()     at Microsoft.Office.Server.Administration.UserProfileApplication.GetProperties(Boolean skipPartitionIds)     at Microsoft.Office.Server.Administration.PartitionPropertiesCache.GetApplicationProperties(UserProfileApplicationProxy proxy)     at Microsoft.Office.Server.Administration.PartitionPropertiesCache.RefreshCacheProperties(Object dummy)     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)     at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()     at System.Threading.ThreadPoolWorkQueue.Dispatch() 
  •  Cannot complete this action.  Please try again.<nativehr>0x80004005</nativehr><nativestack></nativestack>      
From this log we have encounter that user profile have following backend logic :



resolution :
remove domain B user from user profile admin group.

Thursday, May 20, 2021

agentcommonSPRoleChecker.exe

 agentcommonSPRoleChecker是用于检测Agent所在的SharePoint信息的, 例如是否有sharepoint以及版本等,然后会把这个信息同步会DA Control Service.

Noticed that SharePoint server have one service  agentcommonSPRoleChecker.exe running at backend , after checking with the expert to understand that this service is use by the docave agent to get the sharepoint information and sync to DocAve Control Service.

Friday, April 23, 2021

how to use Notepad++ to MASk the IC number at Log file

Under Search mode select : Regular expression

under replace tab : S+[0-9]+[0-9]+[0-9]+[0-9]+[0-9]+[0-9]+[0-9]+[A-Z]

above search is for singapore ic format which is :  S1234567A


Wednesday, February 3, 2021

How to track the progress of SharePoint CU installation ?

 windows > Run > %temp%

inside this temp folder will see the windows installer log file which is referring to the SharePoint CU patching .

can use it to compare with other SharePoint server already completed install , then you will know how soon the installation will complete