föstudagur, 14. október 2011

Dynamics AX batch, permission rights

Dynamics AX 2009 - file and email right permissions in batch job.  Files to be read, written and deleted.  Email to be sent.

First step was to give the AOS service user rights to the file folder to be written.

As these were multiple files, permission sets were used.

void importFromWorkstation(MPSWorkstation _tWorkstation)
{
    int               iNumberOfFiles;
    FileName          sFileName,fileNamePerm, inFile;
    InteropPermission interopPerm;
    Set               permissionSet, permSetFiles;
    System.Array      files;
    int               i, j;
    container         fList;
    #File
    ;

    permissionSet = new Set(Types::Class);
    permissionSet.add(new InterOpPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permissionSet);

    files = System.IO.Directory::GetFiles(_tWorkstation.InDir, "*.ut");
    for( i=0; i<ClrInterop::getAnyTypeForObject(files.get_Length()); i++ )
    {
         fList = conins(fList, conlen(fList)+1, ClrInterop::getAnyTypeForObject(files.GetValue(i)));
     }

    CodeAccessPermission::revertAssert();

    permSetfiles = new Set(Types::Class);

    for(j=1;j<=conlen(fList); j++)
    {
        sFileName = conpeek(fList, j);

        //Read files
        permSetFiles.add(new FileIOPermission(sFileName, #IO_Read));


        //Written files
        fileNamePerm = strrem(sFileName, _tWorkstation.InDir) + 'ut';
        fileNamePerm = _tWorkstation.MarelOut + 'po'+ fileNamePerm;
        permSetFiles.add(new FileIOPermission(fileNamePerm, #io_Write));

        fileNamePerm = strrem(sFileName, _tWorkstation.InDir) + 'ut';
        fileNamePerm = _tWorkstation.MarelOut + 'dilkur' + fileNamePerm;
        permSetFiles.add(new FileIOPermission(fileNamePerm, #io_Write));
    }

    //Email
    permSetFiles.add(new InteropPermission(InteropKind::ComInterop));


    // Sys.Io.File.Delete below
    permSetFiles.add(new InteropPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permSetFiles);

    for(j=1;j<=conlen(fList); j++)
     {
         sFileName = conpeek(fList, j);
         inFile = sFileName;
         sFileName = strrem(sFileName, _tWorkstation.InDir) + 'ut';


         ttsbegin;

         this.parseFileForMarelPO(sFileName, _tWorkstation);
         this.parseFile(sFileName, _tWorkstation);

         System.IO.File::Delete(inFile);

         ttscommit;
     }
    CodeAccessPermission::revertAssert();
}