Добавить элементы в список объявлений для конкретного пользователя - PullRequest
1 голос
/ 09 марта 2009

У меня есть запрос клиента на создание ряда объявлений на основе некоторых данных из другой базы данных. Большая часть этого кажется достаточно простой, но новые элементы должны быть созданы пользователем (логином), указанным во входных данных. Я планировал добавить объявления, используя веб-сервисы списков, но я уверен, что хотел бы избежать использования олицетворения, чтобы получить право создания пользователя. Есть ли способ назначить правильного пользователя создателем без использования олицетворения?

Ответы [ 4 ]

2 голосов
/ 11 марта 2009

Это может быть не тот ответ, который вы ищете, но олицетворение довольно легко, если у вас есть код, запущенный в GAC на сервере SharePoint. Вам не нужно знать пароль, который многие не понимают, поэтому я продолжу предполагать, что именно по этой причине вы не хотели выдавать себя за другого. Вот как это сделать.

Вы можете подключиться к SharePoint, используя типичный конструктор, который вы используете для SPSite, и найти соответствующий объект SPUser. Сделав это, вы можете получить свойство UserToken для этого SPUser. Затем вам нужно будет снова использовать конструктор SPSite, но использовать перегрузку, которая обеспечивает SPUserToken. Тогда все, что вы делаете в SharePoint, будет делаться через олицетворение. Нет необходимости работать с повышенными привилегиями.

Хорошо, теперь, когда я сказал это словами, я попытаюсь угадать код. Это должно быть что-то вроде:

// Just determine the user token for a particular user
SPUserToken userToken = null;
using (SPSite tempSite = new SPSite("http://sharepointurl"))
{
    using (SPWeb tempWeb = tempSite.OpenWeb())
    {
        // I think this next line works, but I'm going from memory
        // I believe the user needs to have already logged into the site at least once
        SPUser user = tempWeb.AllUsers["username"];
        userToken = user.UserToken;
    }
}

// Now do whatever we want impersonating that user
using (SPSite site = new SPSite("http://sharepointurl", userToken))
{
    using (SPWeb web = site.OpenWeb())
    {
        // Do whatever you want here
    }
} 
0 голосов
/ 25 марта 2011

Как указано в комментариях к коду ответа, если пользователь не посещал сайт хотя бы один раз, то нет доступных метаданных пользователя, из которых можно получить правильный токен пользователя.

В SharePoint 2010 вы можете имитировать посещение пользователя с помощью метода EnsureUser, доступного из класса SPWeb (этот фрагмент создает пользователя, а также немного настраивает его профиль):

SPUser alice = web.EnsureUser(@"MYDOMAIN\alice");
SPList userInfo = web.SiteUserInfoList; //metadata storage of user info

SPListItem item = userInfo.GetItemById(alice.ID);
item["About Me"] = "I am Alice from Mel's Diner";
item.Update();
0 голосов
/ 11 марта 2009

Я только что понял, что моим требованием было обойти контрольный журнал в SharePoint, поэтому я очень надеюсь, что это невозможно сделать: -)

Я придумала другое решение: я добавила новое поле пользователя или группы в список объявлений и скопировала имя пользователя AD в это поле. Любой отчет или представление, которые ранее использовали поле «созданный», теперь должны использовать новое поле.

Как насчет ситуации, когда реальный пользователь вносит новый элемент в список объявлений? Это не приведет к обновлению нового поля с зарегистрированным пользователем!

Ну, единственное решение, которое я мог придумать, это добавить триггер ListItem Add в список. Когда добавляется новый элемент, я проверяю, содержит ли новое поле значение, но не обновляю ли я новое поле с идентификатором вошедшего в систему пользователя. Таким образом, новое поле всегда должно содержать действительный идентификатор пользователя.

Я знаю, что это не элегантное решение, но пока это лучшее, что я могу придумать.

0 голосов
/ 09 марта 2009

Я не думаю, что есть способ архивировать это.

Но, возможно, этот обходной путь может помочь. Я должен признать, что я никогда не проверял это, это только идея, как вы можете решить свою проблему.

Вы можете попробовать это. Создайте новое объявление с правами администратора или RunWithElevatedPrivileges (). После этого снова используйте метод RunWithElevatedPrivileges () и установите поле «созданный» для пользователя, который должен быть фактическим создателем объявления. Таким образом, только поле «отредактировано» должно показывать «неправильного» пользователя.

Я знаю, что это не очень элегантное решение, но оно может сработать. ;)

...