Como executar um código como se fosse outro usuário
Resumo para quem tem pouco tempo
É possível criando um job em background rodar um programa como se fosse outro usuário, mesmo sem ter a senha dele
Introdução
Pode parecer trivial para quem já está faz bastante tempo na área, porém em alguns casos precisamos rodar uma BAPI, uma transação ou executar algum programa como se fossemos outro usuário, isso é necessário por exemplo quando estamos fazendo integrações que envolvem aprovação de documentos e não queremos que os logs do documento fiquem com o nome do usuário de integração e sim com o nome da pessoa que realmente fez a aprovação. Afinal daqui a alguns anos eu posso precisar saber se quem aprovou foi o gerente ou o diretor e não vai adiantar ter gravado no log que o aprovador foi o usuário INTEGRASAP ou o WF-BATCH.
Resolução
Quando criamos um job para ser executado é possível indicar um usuário que será na prática quem será usado na execução do programa. Desse usuário indicado que serão lidas as permissões do usuário e no nome dele que ficarão todos os logs do sistema.
Quando estamos criando um job manualmente, é nesse campo que preenchemos o nome do usuário que irá executar. É importante que o usuário que está criando esse job tenha o objeto de autorização S_BTCH_NAM (Vai achando que é qualquer um que tem esse super poder, hehe).
Agora como fazer isso na programação? Vou demonstrar com o exemplo mais simples possível, fazendo um programa que escreve o nome do usuário que o está executando.
E outro que cria um job chamando esse primeiro programa. As funções para criar um JOB são: 'JOB_OPEN', 'JOB_SUBMIT' e 'JOB_CLOSE'.
Se rodarmos o programa diretamente, veremos o nome do usuário que seria nosso "usuário de integração":
Porém ao rodamos o nosso programa que faz a chamada e criação do job, informamos o nome do usuário que queremos que rode o programa.
Recomendados pelo LinkedIn
E agora olhamos nos nossos jobs para ver o resultado, se você quiser ir direto, sem ter que entrar na SM37, pode usar esse atalho abaixo.
Entramos no job para ver que mensagens o programa exibiu (a principio vemos que o autor do job é o nosso usuário de integração mesmo). Para vermos o spool é só marcar a linha do job e clicar em spool.
Agora já vemos que o usuário que aparece aí é o usuário que queremos usar no processamento do programa. Então clicamos nesse ícone na coluna "Tipo" para visualizar a saída desse job. E se tudo deu certo, o sy-uname estará preenchido com o valor CSANTOS.
E aí está, foi exatamente isso que aconteceu.
Claro que esse é um exemplo muito simples, somente para demonstrar o funcionamento das funções que fazem a criação do job.
Em cenários mais complexos podemos ter que passar muitas informações para que esse job processe, que podem ser recuperadas de N maneiras, desde salvar em uma tabela Z para que o job leia, criar parâmetros e variantes para execução do job, alocar em memória, aí vai da criatividade e da necessidade de cada um poder preencher os espaços que faltam de acordo com a aplicação.
E lembre-se que tudo sempre guarda logs, então se usar essa informação para o mal:
-- Diego Frutuoso Machado Rocha (Desenvolvedor SAP)
Analista e desenvolvedor de Sistemas de Informação
3 aSe for usar para o mal foi ótimo kkkk