Talend ASP.NET MVC
Talend ASP.NET MVC
如何从应用程序 ASP.NET MVC 中 run/execute 工作任务?
我有一个用 talend 创建的作业:这个作业将数据从一个数据库迁移到另一个数据库。我希望在应用程序 asp.net mvc 中部署这个作业。
对此有什么想法吗?
你能 运行 命令行批处理文件 .bat 或来自 asp.net mvc 的类似文件吗?如果是,那么您可以将 talend 作业导出为批处理作业,然后 运行 它
授予对 Web 应用程序的文件系统级别访问权限总是有风险的业务 :) 但有时会发生。这是您需要的
- 一个单独的技术用户 - 本地或 AD - 对您存储导出的 Talend 作业的文件夹具有适当的访问权限。我有点不确定正确的访问,首先是因为编译的 java 作业与 EXE 并不完全相同,仅由 java 执行,其次因为它也可能取决于你在工作。但是可以通过几次尝试来弄清楚,从读+写开始。 (从技术上讲,您可以使用 IIS 用户运行您的网站来执行此操作,但这不太安全。)
- 搜索模拟的解释或代码示例(我也会提供一个)。您使用模拟来更改您的代码所在的环境 运行,从 IIS 用户到上面的技术用户。因为您可以在代码中执行的操作取决于用户是谁。
- 实现类似这样的程序流程:模拟技术用户 --> 通过调用 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
如何从应用程序 ASP.NET MVC 中 run/execute 工作任务? 我有一个用 talend 创建的作业:这个作业将数据从一个数据库迁移到另一个数据库。我希望在应用程序 asp.net mvc 中部署这个作业。 对此有什么想法吗?
你能 运行 命令行批处理文件 .bat 或来自 asp.net mvc 的类似文件吗?如果是,那么您可以将 talend 作业导出为批处理作业,然后 运行 它
授予对 Web 应用程序的文件系统级别访问权限总是有风险的业务 :) 但有时会发生。这是您需要的
- 一个单独的技术用户 - 本地或 AD - 对您存储导出的 Talend 作业的文件夹具有适当的访问权限。我有点不确定正确的访问,首先是因为编译的 java 作业与 EXE 并不完全相同,仅由 java 执行,其次因为它也可能取决于你在工作。但是可以通过几次尝试来弄清楚,从读+写开始。 (从技术上讲,您可以使用 IIS 用户运行您的网站来执行此操作,但这不太安全。)
- 搜索模拟的解释或代码示例(我也会提供一个)。您使用模拟来更改您的代码所在的环境 运行,从 IIS 用户到上面的技术用户。因为您可以在代码中执行的操作取决于用户是谁。
- 实现类似这样的程序流程:模拟技术用户 --> 通过调用 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