SharePoint根据List ID查询指南:GUID反查与名称互查的多种方法

发布时间:2026/10/10 5:15:30
SharePoint根据List ID查询指南:GUID反查与名称互查的多种方法 做SharePoint开发这几年我几乎每个月都会遇到这样的求助同事发来一段错误日志里面躺着一串看起来像乱码的GUID问我“这个list id是哪个列表的”或者对接第三方系统时对方只甩给我一个列表ID让我把数据同步过去我连列表叫什么名字都不知道。标题里提到的“SharePoint根据list id查询”说白了就是这么一件事——拿到一个Guid之后怎么定位到对应的列表反过来知道列表名字之后又怎么把它的ID查出来。这个需求听起来简单但实际处理起来牵扯到浏览器、PowerShell、C#代码好几套路子而且SharePoint Online和SharePoint 2019本地环境里的玩法还不一样。这篇文章就把我这么多年攒下来的几种办法从头到尾梳理一遍覆盖开发、排障、迁移三类场景适合做CSOM开发、写定时任务、维护别人留下的老项目、以及经常需要做数据迁移的朋友参考。1. 先把list id这个概念掰扯清楚1.1 Guid格式与两个查询方向SharePoint里的每个列表List从创建那一刻起系统就会给它分配一个全局唯一标识符GUID也就是大家常说的list id。它长这样c1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a在浏览器地址栏里它经常被URL编码过带着花括号长这样%7Bc1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a%7D其中%7B就是{%7D就是}解码之后就是花括号包着的GUID。说到“根据list id查询”实际工作中其实是两个完全相反的方向方向A知道列表名称查list id。比如你写CSOM程序要操作某个列表大多数时候用列表名称就能定位但有些接口、有些日志场景需要ID这时候就得把ID捞出来。方向B手里只有一个GUID反查它对应哪个列表。这种情况多出现在排障中——日志里报了“列表找不到”报错信息里带一个ID或者接手老项目配置文件里存了一堆GUID没人告诉你分别对应什么。这两个方向我后面都会讲到。说实话网上搜“SharePoint list id”出来的文章十篇里八篇是讲方向A的教你用PowerShell捞出所有列表的ID。但真正做维护的人方向B反而是更迫切的痛点。所以这篇文章我会在方向B上多花些笔墨。1.2 你通常在什么场景下碰见list id梳理一下我遇到过的典型场景方便你对照自己是不是也在这坑里日志和接口报错调用列表API时如果列表不存在错误信息里往往带着一串GUID这时候你手里没有任何上下文只能靠ID反查。接手老代码前任开发在代码里硬编码了ListId常量你根本不知道这个ID对应的是哪个站点下的哪个列表。数据迁移和归档从生产环境导出一批列表数据对方给你的清单上只有ID没有名称你得逐个确认。配置表和文档维护项目里把列表ID写在配置数据库或Excel清单里时间一长没人记得哪个ID是哪个列表。搞清楚了list id是什么、什么时候会用到下面就可以进入正题了。2. 浏览器里怎么把list id找出来不写一行代码很多时候你只是临时查一次完全没必要装PowerShell模块、写脚本。浏览器里三步就能拿到ID。2.1 从列表设置页面直接拿这个方法最直观。进入列表页面后点右上角的齿轮图标选择“列表设置”List Settings。此时浏览器地址栏会变成类似这样的地址https://yourtenant.sharepoint.com/sites/yourteam/_layouts/15/listedit.aspx?List%7Bc1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a%7DList参数后面那一串带%7B和%7D的内容就是你要的list id。把%7B替换成{、%7D替换成}或者直接把整串丢到一个在线URL解码工具里解码就得到了标准的GUID格式。这里有个细节要注意别把地址栏里后面可能跟的参数一起复制进去。如果页面地址里有Source...之类的尾巴只截取到%7D为止。我见过不少同事把Source...也复制到代码里结果GUID解析直接报错。2.2 从列表视图页面拿不进设置页面也行。任何一个列表的默认视图页面地址栏都会带List参数。比如https://yourtenant.sharepoint.com/sites/yourteam/Lists/ProjectDocuments/AllItems.aspx?Listc1d1c6f8%2D9c3e%2D4a2b%2D8f5e%2D7a6b2d0c4e9a注意这里有个不同点URL里的-连字符有时候会被编码成%2D而且可能不带花括号。你在代码里用的时候%2D要还原成-所以看到这种格式别慌它其实还是同一个GUID。这个方法有一个好处不需要进设置页打开列表就能看。如果列表的权限比较严格你恰好只有查看权限没有管理权限这个方式比第2.1节的方式更友好。2.3 浏览器开发者工具抓请求列表页面URL不带ID时有些列表页面的URL是经过精简的比如https://yourtenant.sharepoint.com/sites/yourteam/ProjectDocuments/Forms/AllItems.aspx地址栏里根本没有List参数。这时候就需要用开发者工具来抓包。操作步骤很简单打开列表页面按F12打开浏览器开发者工具。切到Network网络标签页。在地址栏按回车或F5刷新页面。在Network列表里过滤输入_api或者listdata关键字。点击任何一个对_api/web/lists或_api/web/lists(guid...)的请求在请求URL或者请求体里就能找到GUID。比如_api/web/lists(guidc1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a)这个请求括号里那个带guid前缀的字符串就是list id。这个方法在排障时特别有用。尤其是当你发现某个页面的列表数据加载异常想确认页面到底加载的是哪个列表时抓一下网络请求一目了然。比到处问人要ID靠谱多了。3. 用PowerShell批量查list id含SharePoint 2019本地环境浏览器方式适合偶尔查一两个列表但如果你要做清单核对、批量导出、或者写进自动化脚本就得靠PowerShell了。这里我分两个环境讲透一是SharePoint OnlineMicrosoft 365二是SharePoint 2019本地部署。3.1 PnP PowerShell一句话查询现在是2025年了做SharePoint Online开发直接无脑用PnP PowerShell模块。安装方式Install-Module PnP.PowerShell -Scope CurrentUser连接站点Connect-PnPOnline -Url https://yourtenant.sharepoint.com/sites/yourteam -Interactive如果企业环境开了条件访问可能会弹出一个浏览器窗口让你登录这是正常的。登录一次后本次会话内执行命令不需要重复登录。然后你就可以用下面这几条命令把站点下所有列表的ID和信息全部导出来# 导出所有列表的名称、ID、条目数、相对URL Get-PnPList | Select-Object Title, Id, ItemCount, RootFolder | Format-Table -AutoSize # 只查某个特定名称的列表 Get-PnPList -Identity 项目文档 | Select-Object Title, Id, ItemCount, RootFolder.ServerRelativeUrl # 导出成CSV方便维护清单 Get-PnPList | Select-Object Title, Id, ItemCount | Export-Csv C:\temp\all-lists.csv -NoTypeInformation -Encoding UTF8Get-PnPList -Identity参数其实很智能它接受列表名称、列表IDGUID字符串、甚至列表的相对URL作为输入。所以方向A和方向B用这一条命令都能搞定# 方向B只知道GUID反查列表信息 $listId c1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a Get-PnPList -Identity $listId | Select-Object Title, Id, ItemCount, DefaultViewUrl执行完Title就是你要的列表名称。如果这个ID对应的列表不存在命令会抛异常提示找不到列表这样你也能反向确认ID是不是有效。3.2 SharePoint 2019本地环境的Connect差异很多朋友还在维护SharePoint 2019本地环境。注意这里和Online在连接方式上有比较大的差异。SharePoint 2019本地不支持-Interactive这种方式你需要用-UseWebLoginConnect-PnPOnline -Url http://sp2019server/sites/it -UseWebLogin执行后会弹出一个传统的Windows登录窗口不是浏览器那种输入域账号密码即可。如果你的账号是管理员最好用有足够权限的账号连接否则Get-PnPList可能会漏掉某些列表或直接报访问拒绝。还有一点值得提醒PnP PowerShell版本的选择跟SharePoint版本强相关。在2025年这个时间点PnP.PowerShell新版统包模块依然兼容2019但某些旧版PnP命令比如SharePointPnPPowerShell2019模块已经停止维护了。如果你用的是很老的环境Install-Module SharePointPnPPowerShell2019仍然能装但我个人建议直接用新版PnP.PowerShell至少在2025年主流文档和脚本示例都围绕新版来写遇到问题好查资料。如果不想用PnP模块SharePoint 2019本地还有一个更传统的方式——直接在装有SharePoint管理工具的服务器上跑Microsoft.SharePoint.PowerShell模块。这种方式的好处是不依赖外部模块服务器自带。示例如下Add-PSSnapin Microsoft.SharePoint.PowerShell $site Get-SPSite http://sp2019server/sites/it $web $site.OpenWeb() foreach ($list in $web.Lists) { if ($list.Title -eq 项目文档) { Write-Host 列表ID: $list.ID Write-Host 列表URL: $list.DefaultViewUrl } } $web.Dispose() $site.Dispose()这种写法的优点是不需要联网装模块、不需要额外的PnP依赖缺点是只能在装了SharePoint管理工具的服务器上跑不能在普通开发机上直接执行。另外要注意$web.Lists拿到的集合里可能包含隐藏列表你按Title匹配的时候如果出现查不到的情况先想想列表名称是不是变了或者在隐藏列表里。3.3 用ID反查列表信息的完整例子在PowerShell里用GUID反查列表推荐直接用-Identity传GUID字符串。这里有一个容易踩的坑-Identity传GUID时可以带花括号、也可以不带大小写也不敏感但不要传URL编码后的%7B%7D格式。必须是解码后的GUID。实操中我习惯先做一次解码确保字符串干净。示例$encodedId %7Bc1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a%7D $decodedId [System.Uri]::UnescapeDataString($encodedId).Trim({, }) # 结果为 c1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a Get-PnPList -Identity $decodedId | Format-List Title, Id, ItemCount, DefaultViewUrl, RootFolder如果查询结果返回空或者报错先别急着怀疑环境。十次里至少有五次是GUID复制的时候多复制了一个空格或者%2D没转回-。处理办法是把字符串做Trim再查。4. 在C# CSOM代码里根据list id查询完整套路PowerShell适合脚本化操作但如果你是写正式的开发项目——比如控制台定时任务、Windows服务、或者被其他系统调用的类库——那通常是用C# CSOM客户端对象模型。这一节我把两种方向的核心代码都写出来并解释背后的逻辑。4.1 为什么用CSOM而不是RESTCSOM和REST都能实现“根据列表ID查询列表”这件事。REST方式大概是GET https://yourtenant.sharepoint.com/sites/yourteam/_api/web/lists(guidc1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a)用HttpClient发个请求也能拿到JSON结果。但在实际开发中我更推荐CSOM原因有三第一CSOM的认证处理更成熟尤其在本地SharePoint 2019环境里可以用ClientContext直接走Windows集成认证不需要自己拼认证头。第二CSOM的类型安全更好拿到的是强类型的List对象可以直接访问Title、Id、DefaultViewUrl等属性出错时智能提示比JSON字符串友好得多。第三在写复杂逻辑时CSOM的查询模型比手写REST路径直观很多比如后面顺便查列表下的视图、字段、权限CSOM代码阅读成本低。4.2 方向A知道列表名称怎么拿它的ID这个需求最常见于代码里需要动态适配不同站点的场景。代码模板如下using System; using System.Security; using Microsoft.SharePoint.Client; public class ListIdHelper { public static Guid GetListIdByTitle(string siteUrl, string listTitle, string username, string password) { using (var context new ClientContext(siteUrl)) { context.Credentials new SharePointOnlineCredentials(username, GetSecureString(password)); context.ExecuteQuery(); var web context.Web; web.Lists.Load(lists lists.Where(l l.Title listTitle).Include(l l.Id, l l.Title)); context.ExecuteQuery(); var match web.Lists.FirstOrDefault(l l.Title listTitle); if (match null) { throw new Exception($未找到名为 {listTitle} 的列表); } return match.Id; } } private static SecureString GetSecureString(string value) { var ss new SecureString(); foreach (char c in value) { ss.AppendChar(c); } return ss; } }这段代码有三个关键点using包住ClientContext用完自动释放连接避免控制台程序长时间跑的时候连接池爆炸。web.Lists.Load加了一个Where条件的LINQ表达式理论上可以把过滤条件推送到服务端执行比把整个web.Lists捞回来再在内存里过滤高效得多。查询列表前必须先执行ExecuteQuery()让请求真正到达服务器。CSOM的延迟加载机制对新手来说是最容易懵的地方——你以为context.ExecuteQuery()执行完了就有了数据实际上属性未加载的字段访问时会抛PropertyOrFieldNotInitializedException。如果你是在SharePoint 2019本地环境认证方式要换成context.Credentials new NetworkCredential(username, password);或者用context.AuthenticationMode ClientAuthenticationMode.Default让程序自动使用当前Windows身份。别把Online那套SharePointOnlineCredentials直接搬过来用会一直报401。4.3 方向B只知道list id怎么把列表信息捞出来这个才是标题里“根据list id查询”最贴合的代码。CSOM提供了直接按ID获取列表对象的APIusing System; using Microsoft.SharePoint.Client; public class ListInfo { public string Title { get; set; } public Guid Id { get; set; } public string DefaultViewUrl { get; set; } public int ItemCount { get; set; } } public class ListQueryHelper { public static ListInfo GetListById(string siteUrl, string listId, string username, string password) { using (var context new ClientContext(siteUrl)) { context.Credentials new SharePointOnlineCredentials(username, GetSecureString(password)); var web context.Web; // 关键一步直接用GUID定位列表 var list web.Lists.GetById(new Guid(listId)); context.Load(list, l l.Title, l l.Id, l l.ItemCount, l l.DefaultViewUrl); context.ExecuteQuery(); return new ListInfo { Title list.Title, Id list.Id, DefaultViewUrl list.DefaultViewUrl, ItemCount list.ItemCount }; } } }这里有个很实用的写法context.Load(list, l l.Title, ...)后面可以跟多个Lambda表达式指定要加载哪些属性。如果不指定默认只加载一些基础属性访问ItemCount这种属性时会触发额外的加载或直接抛异常。显式指定属性是一个好习惯能避免“属性未初始化”的经典CSOM报错。使用的时候直接拿ID查询列表是否存在try { var info ListQueryHelper.GetListById( https://yourtenant.sharepoint.com/sites/yourteam, c1d1c6f8-9c3e-4a2b-8f5e-7a6b2d0c4e9a, adminyourtenant.onmicrosoft.com, yourpassword); Console.WriteLine($列表名称: {info.Title}); Console.WriteLine($条目数量: {info.ItemCount}); Console.WriteLine($默认视图URL: {info.DefaultViewUrl}); } catch (Exception ex) { Console.WriteLine($查询失败可能列表不存在: {ex.Message}); }4.4 关于“list id会变吗”的坑做开发时很多人问过我列表改名了、列表被移动到别的站点组了、或者列表的模板换过了ID会不会变我的答案是GUID在创建那一刻生成后不会再变。改名不影响移动站点内位置不影响模板修改也不影响。这个设计跟数据库表的主键类似——主键一旦生成就和这个实体绑定终身。但有两个例外情况实操中非常容易踩坑列表被删除后重建。哪怕重建的列表名称一模一样、放在同一个位置、字段配置都一样它得到的list id也是全新的。如果你代码里写死了旧的ID重建后必须同步更新配置。站点备份恢复或内容数据库迁移时。在SharePoint 2019本地环境如果你用内容数据库备份还原的方式把站点迁移到另一台服务器一般来说list id会保持原样但如果通过导出导入站点模板的方式重建站点则可能生成全新的GUID。所以迁移后一定要重新核对一次ID清单不要想当然。我在实际项目中见过最经典的一次事故客户把测试环境的一个文档库删了又重新建了同名的结果生产环境同步脚本里硬编码的ID还是旧的每次跑同步都报列表找不到排查了两天才发现是ID对不上。从那以后我所有写死列表ID的地方一律改成动态查名称再拿ID或者至少把ID放到配置中心里管理绝不散落在代码各处。5. 常见问题与排查技巧实录5.1 常见问题速查表下面这张表是我这几年被问到最多的问题合集。直接抄作业按图索骥就行。问题现象根本原因解决办法报错“列表不存在”但ID看着挺对URL编码没解码或GUID后带了多余参数用Uri.UnescapeDataString解码截掉后面的内容PowerShellGet-PnPList -Identity $id抛异常当前连接上下文不包含目标站点或ID不是该站点下的列表确认当前连接的站点URL换到正确站点再查CSOM里GetById(new Guid(...))报格式错误传入的字符串不是合法GUID比如多了空格或逗号先Trim()再TryParse校验一次再往GetById里传SharePointOnlineCredentials报401用了Online认证方式去连本地2019本地环境改用NetworkCredential或ClientAuthenticationMode.DefaultGet-PnPList查不到列表但浏览器能看到账号对目标站点没有枚举列表权限或者列表是隐藏列表换有权限的账号或加-Includes Hidden参数辅助查询拿到了ID但在错误日志里看到的是{...}包着IDGUID本来就有带花括号和不带花括号两种表示法代码里解析时对花括号做Trim({,})处理再做GUID解析5.2 快速验证拿到的ID是不是对应列表如果你只是临时想验证一个ID对应哪个列表最快速的办法不是写代码而是把这串GUID拼到一个URL里直接用浏览器访问https://yourtenant.sharepoint.com/sites/yourteam/_layouts/15/listedit.aspx?List%7B你的ID%7D注意把花括号和URL编码补全。如果ID正确且有权限浏览器会直接打开这个列表的设置页面页面左上角的名字就是列表名。如果ID错误会提示“文件未找到”或“不存在”。这个方法非常适合排障时快速确认不需要开PowerShell不需要装任何工具只要有浏览器就行。5.3 区分list id和list item id这个问题看起来很基础但真的隔三差五就有人问尤其刚接触SharePoint开发的同学。list id列表自身的GUID一个列表只有一个标识的是“列表”这个容器对象。list item id列表里某一条数据的ID一般是从1开始的整数标识的是“列表中的一行数据”。两者完全不是一个维度。你在日志里看到ListIdxxxx-xxxx和ItemId12345不要试图用一个去替代另一个。访问列表条目时用list.GetItemById(12345)而定位列表本身用web.Lists.GetById(new Guid(xxx))两个不是一回事。5.4 一个提高排查效率的小习惯最后分享一个我个人坚持了很久的习惯在任何代码里输出列表相关日志时同时打印列表名称和ID而不是只打其中一个。比如在CSOM程序里Console.WriteLine($[列表操作] Title{list.Title}, ListId{list.Id});在PowerShell脚本里Write-Host 处理的列表: $($list.Title), ID: $($list.Id)这样做的原因是ID能精确定位但人不直观名称直观但可能存在重名或模糊的情况。两个一起输出日志里既能看懂是哪个列表又能拿到程序实际使用的ID。等哪天出了问题你不需要再反查一遍日志本身已经把答案给你了。还有一个更进一步的建议如果维护的SharePoint环境列表很多定期用Get-PnPList导出一份ID清单到Excel或Wiki一个月更新一次。这套“ID对照表”在排障、审计、交接时都特别有用尤其是接手别人项目的时候有这份表能省掉一大半探索时间。我在实际项目里的体会是“按list id查列表”这个操作本身不难难的是在整个开发运维流程里形成一个稳定的规范——ID从哪来、怎么验证、怎么维护。把这套流程理顺了比背下任何一条命令都有用。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询