Talend ASP.NET MVC

Talend ASP.NET MVC

如何从应用程序 ASP.NET MVC 中 run/execute 工作任务? 我有一个用 talend 创建的作业:这个作业将数据从一个数据库迁移到另一个数据库。我希望在应用程序 asp.net mvc 中部署这个作业。 对此有什么想法吗?

你能 运行 命令行批处理文件 .bat 或来自 asp.net mvc 的类似文件吗?如果是,那么您可以将 talend 作业导出为批处理作业,然后 运行 它

授予对 Web 应用程序的文件系统级别访问权限总是有风险的业务 :) 但有时会发生。这是您需要的

  1. 一个单独的技术用户 - 本地或 AD - 对您存储导出的 Talend 作业的文件夹具有适当的访问权限。我有点不确定正确的访问,首先是因为编译的 java 作业与 EXE 并不完全相同,仅由 java 执行,其次因为它也可能取决于你在工作。但是可以通过几次尝试来弄清楚,从读+写开始。 (从技术上讲,您可以使用 IIS 用户运行您的网站来执行此操作,但这不太安全。)
  2. 搜索模拟的解释或代码示例(我也会提供一个)。您使用模拟来更改您的代码所在的环境 运行,从 IIS 用户到上面的技术用户。因为您可以在代码中执行的操作取决于用户是谁。
  3. 实现类似这样的程序流程:模拟技术用户 --> 通过调用 Talend 生成的批处理执行 talend 作业 --> 撤消模拟。

系统调用:

#region accountManagement

[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);

WindowsImpersonationContext impersonationContext;

private bool impersonateValidUser(String userName, String domain, String password)
{
    const int LOGON32_LOGON_INTERACTIVE = 2;
    const int LOGON32_LOGON_NETWORK = 3;
    const int LOGON32_LOGON_BATCH = 4;
    const int LOGON32_LOGON_SERVICE = 5;
    const int LOGON32_LOGON_UNLOCK = 7;
    const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
    const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
    const int LOGON32_PROVIDER_DEFAULT = 0;

    WindowsIdentity tempWindowsIdentity;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;

    if (RevertToSelf())
    {
        // Int32 result = LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token);
        // Response.Write(">>> " + result.ToString());
        if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
            if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
            {
                tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                impersonationContext = tempWindowsIdentity.Impersonate();
                if (impersonationContext != null)
                {
                    CloseHandle(token);
                    CloseHandle(tokenDuplicate);
                    return true;
                }
            }
        }
    }

    if (token != IntPtr.Zero)
        CloseHandle(token);
    if (tokenDuplicate != IntPtr.Zero)
        CloseHandle(tokenDuplicate);
    return false;
}

private void undoImpersonation()
{
    impersonationContext.Undo();
}

#endregion

以及您必须自己实施的内容:

            String iuUser = System.Configuration.ConfigurationManager.AppSettings["domain.accountop.user"];
            String iuPass = System.Configuration.ConfigurationManager.AppSettings["domain.accountop.pass"];
            String iuDomn = System.Configuration.ConfigurationManager.AppSettings["domain.name"];
            if (impersonateValidUser(iuUser, iuDomn, iuPass))
            {
                try
                {
                    // Execute your job here
                    ...
                    // finally: undo impersonation
                    undoImpersonation();
                    // maybe inform the user that it was successful
                }
                catch (Exception ex)
                {
                    Exception innerException = ex.InnerException;
                    // give some nice error message here, make a log entry, etc
                }
            }
            else
            {
                // The impersonation failed. Include a fail-safe mechanism here.
                // number of possible errors will get you here: wrong or expired password, user does not have a privilege to start an interactive session, etc.
            }

我建议从 TAC 中将您的 Talend 作业公开为 Web 服务。部署后,您可以使用标准技术(客户端或服务器端)调用 Web 服务。

这是 Talend 关于该主题的文档的 link: https://help.talend.com/display/KB/Deploying+or+exposing+a+Job+as+a+Web+service