Я написал это, потому что нигде не смог найти ответ на свою проблему. Этот пост Джоэля Олесона , в котором описана проблема, аналогичная моей, дал мне подсказку, куда обращаться в поисках недостающих данных. И Этот пост Кори Рота показал мне, как программно добавлять ссылки пользователям Мои ссылки.
Перво-наперво - вам нужно восстановить резервную копию базы данных, которая содержит данные My Links. Вы не хотите восстанавливать поверх своей рабочей базы данных, вы хотите восстановить ее в другом месте. Ссылки хранятся в базе данных SSP. (Вы можете узнать имя базы данных, зайдя в Central Admin -> Shared Services Admin, затем откройте меню для SSP и нажмите Edit Properties - база данных SSP приведена на странице свойств.)
После восстановления базы данных вы хотите получить информацию о ссылке:
- имя учетной записи домена пользователя, которому принадлежит ссылка,
- URL ссылки
- название ссылки
Этот запрос даст вам эту информацию:
SELECT UPF.NTName, UL.Url, UL.Title
FROM UserLinks UL INNER JOIN UserProfile_full UPF ON UL.recordID = UPF.recordID
INNER JOIN UserPrivacyPolicy UPP ON UL.PolicyId = UPP.id
ORDER BY NTName
(я должен отметить, что я не принял во внимание, к какой группе или уровню конфиденциальности были установлены ссылки, вы, вероятно, могли бы найти эту информацию, просмотрев информацию в таблице UserPrivacyPolicy)
Я скопировал результаты в Excel и сохранил их в виде файла .csv (список, разделенный запятыми) - просто потому, что у моего рабочего сервера не было доступа к месту, где я восстановил свою базу данных. Я заказал столбцы с заголовком «Последний», потому что заголовок может содержать запятые, и это может испортить то, как я читаю данные. (Я проверил, а два других поля не содержат запятых - вы должны проверить свои, прежде чем делать это предположение.)
Затем я написал небольшое консольное приложение для импорта данных. Требуется два аргумента:
Используются следующие ссылки:
- Microsoft.Office.Server (C: \ Program Files \ Common Files \ Microsoft Shared \ Расширения веб-сервера \ 12 \ ISAPI \ Microsoft.Office.Server.dll)
- Microsoft.SharePoint (C: \ Program Files \ Common Files \ Microsoft Shared \ Расширения веб-сервера \ 12 \ ISAPI \ Microsoft.SharePoint.dll)
- System
- System.Data
- System.Web
- System.Xml
А это код:
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Server;
using Microsoft.Office.Server.UserProfiles;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using System.Web;
namespace UserLinks
{
class Program
{
static void Main(string[] args)
{
string _accountName = "", _linkTitle = "", _url = "", _tmp = "", _path = "", _SPSsite = "";
// Check arguments
if (args.Length != 2)
{
ShowUsage();
return;
}
_path = args[0];
_SPSsite = args[1];
using (SPSite _site = new SPSite(_SPSsite))
{
ServerContext _context = ServerContext.GetContext(_site);
UserProfileManager _userProfileManger = new UserProfileManager(_context);
/* Expecting a comma seperated list with 3 columns:
* AccountName in the format Domain\Account name - I am assuming there are no commas in this field
* URL - I am assuming there are no commas in this field
* Link Title - link title is last because there may be commas in the title
*/
TextReader _reader = new StreamReader(_path, System.Text.Encoding.Default);
while (_reader.Peek() != -1)
{
_tmp = _reader.ReadLine();
_accountName = _tmp.Substring(0, _tmp.IndexOf(','));
_tmp = _tmp.Replace(_accountName + ",", "");
_url = _tmp.Substring(0, _tmp.IndexOf(','));
_linkTitle = _tmp.Replace(_url + ",", "");
try
{
UserProfile _currentUser = _userProfileManger.GetUserProfile(_accountName);
QuickLinkManager _quickLinkManager = _currentUser.QuickLinks;
_quickLinkManager.Create(_linkTitle, _url, QuickLinkGroupType.General, null, Privacy.Private); //I am assuming that all links have no group assigned to them and they are all private links
}
catch (Exception ex)
{
Console.WriteLine(_accountName);
Console.WriteLine(ex);
}
}
_reader.Close();
}
}
private static void ShowUsage()
{
Console.WriteLine("Usage");
Console.WriteLine("UserLinks [FilePath] [SharePoint URL]");
}
}
}
Таким образом, проблема решена и в качестве дополнительного преимущества эта программа может использоваться для принудительного отображения ссылок в списке Мои ссылки пользователя.