Pergunta

Eu criei um conjunto de sites dentro de uma aplicação web com o usuário A como um administrador de conjunto de sites. Eu adicionei um link na página do recurso site. No clique do que apontam Eu estou tentando criar um job.Below temporizador é o código executado no clique de link

//Allow unsafe updates.
 SPContext.Current.Web.AllowUnsafeUpdates = true;

//Get current web application.
SPWebApplication webApp = SPContext.Current.Site.WebApplication;

// Create new job.
ArchiveJob automaticArchiveJob = new ArchiveJob(scheduleDetails.scheduleName, webApp);

SPHourlySchedule hourlySchedule = new SPHourlySchedule();
hourlySchedule.BeginMinute = 0;
hourlySchedule.EndMinute = 1;
automaticArchiveJob.Schedule = hourlySchedule;

//Finally update archival job.
automaticArchiveJob.Update();

Agora, quando eu entrei com o usuário A e clique no link na página 'configurações do site', eu recebo uma exceção de segurança com a mensagem "Access Denied" na linha automaticArchiveJob.Update(). Mas se eu logado com o usuário administrador (eu também estou conectado para a máquina usando este usuário) e clique no link ele cria com sucesso o trabalho. Também fiz usuário um membro do grupo WSS_ADMIN_WPG mas ainda obter o mesmo problema. Existe alguma outra coisa que eu preciso fazer para resolver o problema.

Foi útil?

Solução

O "Acesso negado" é comportamento esperado dado o que você está tentando fazer. Permitam-me explicar.

Quando uma instância de trabalho de timer é criado, ele é mantido no banco de dados de configuração do farm. Acesso a este banco de dados para fins de escrita é uma operação privilegiada; como regra geral, somente a conta do serviço de exploração (isto é, a conta sob a qual executa Owstimer.exe) ou contas que têm explicitamente os direitos necessários para realizar tal operação no banco de dados de configuração (normalmente administradores) será bem sucedida.

Por padrão, a tentativa de instanciar um trabalho de timer de dentro do contexto coleção site vai falhar. Tentar a operação em um bloco de privilégios elevados (via SPSecurity.RunWithElevatedPrivileges) só vai resultar em contexto da conta do pool de aplicativos do aplicativo Web que está sendo usado em vez do contexto do usuário atual; isso só terá êxito se a conta do pool aplicativo tem direitos para gravar no banco de dados de configuração do farm. Se isso acontecer, é normalmente porque (a) a conta de serviço fazenda está sendo usado em funções que não deve estar em (para rodar aplicativos web de conteúdo, por exemplo), ou (b) permissões extras foram concedidas para o pool de aplicativos conta. Ambos os casos representam um desvio de um modelo operacional de melhores práticas.

instâncias trabalho de timer são tipicamente criados em tempo de ativação do recurso em recursos de escopo, quer ao nível Farm ou WebApplication. Por quê? Porque esses recursos são normalmente ativadas por administradores a partir da linha de comando (assumindo que o administrador também tem direitos no banco de dados de configuração fazenda) ou de dentro da Administração Central (onde a ativação ocorre através da conta de serviço fazenda - a garantia de ter direitos para o banco de dados de configuração ). Quando o recurso é ativado e método FeatureActivated do SPFeatureReceiver é chamado, é seguro (a partir de uma perspectiva de segurança) para configurar o trabalho de timer.

Resolver o seu problema particular corretamente envolverá transformar o problema em sua cabeça um pouco. Em vez de tentar instanciar o trabalho de timer de dentro do conjunto de sites sob demanda, eu recomendo configurar o equivalente a uma "varredura" trabalho de timer no momento o seu recurso é ativado. Evidentemente, isso leva mais planejamento e esforço do que o que você está tentando fazer, mas o seu caminho atual é só ir ao trabalho se a segurança é de alguma forma ajustada -. E isso não é recomendado

Quando eu estava montando minha BLOB cache de fazenda nivelado Característica ( http://blobcachefarmflush.codeplex.com ) , eu tinha que fazer a mesma coisa a mim mesmo. Você pode ver os detalhes de como eu trabalhei através da criação de emprego temporizador na classe FeatureReceiver (BlobCacheFarmFlushSweepJobFeatureReceiver). O resto do código e documentação associada também pode ajudar com alguns dos outros desafios que surgem.

Sinta-se livre para usar o que você encontra em qualquer forma; É por isso que ele está lá!

Espero que ajude. Se há questões de acompanhamento, o fogo longe e eu vou responder o melhor que eu puder: -)

Outras dicas

Tente substituir o método SPPersistedObject.HasAdditionalUpdateAccess () e retornar true.

protected override bool HasAdditionalUpdateAccess() { return true; }

Eu RunWithElevatedPrivileges usado

SPSecurity.RunWithElevatedPrivileges (delegado () { });

Ele funciona para mim ..... alguém tem outra solução? Se assim for, por favor me avise.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top