(Obwohl es nicht empfohlen wird Büro-Interop in Server zu verwenden, aber manchmal haben wir ...)
Die Frage der Sicherheit in Zusammenhang steht. Die Benutzeridentität für den ASP.NET-Prozess hat nicht die Zugriffsrechte für die Verwendung der Office-App, und die Identität sollte nur die minimalen Berechtigungen aufweisen, die zum Ausführen Ihrer Anwendungen erforderlich sind. Sie können Code-Identitätswechsel verwenden, um die Berechtigungen zur Laufzeit zu erhöhen, ohne Identitätswechsel in web.config einzurichten oder ein hohes privilige Konto für mein ASP.NET-Benutzerkonto zu verwenden. Ich habe es im Server verwendet und ich mag diesen Ansatz.
Sie können google darüber mehr wissen. Hier ist der Code von http://support.microsoft.com/kb/306158:
public class CodeImpersonate
{
/// <summary>
/// This logon type is intended for users who will be interactively using the computer, such as a user being logged on by a terminal server,
/// remote shell, or similar process. This logon type has the additional expense of caching logon information for disconnected operations; therefore,
/// it is inappropriate for some client/server applications, such as a mail server.
/// </summary>
public const int LOGON32_LOGON_INTERACTIVE = 2;
/// <summary>
/// Use the standard logon provider for the system. The default security provider is negotiate,
/// unless you pass NULL for the domain name and the user name is not in UPN format. In this case, the default provider is NTLM.
/// Windows 2000: The default security provider is NTLM.
/// </summary>
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[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);
public bool ImpersonateValidUser(String userName, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
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;
}
public void UndoImpersonation()
{
if (impersonationContext != null)
impersonationContext.Undo();
}
}
Kopieren Sie den obigen Code in einer Datei. Hier ist ein Beispiel Gebrauch davon:
CodeImpersonate codeImpersonate = null;
try
{
codeImpersonate = new CodeImpersonate();
var isLoggedIn = codeImpersonate.ImpersonateValidUser(AppConfigs.OfficeUser, AppConfigs.OfficeUeerDomnia, AppConfigs.OfficeUserPass);
if (isLoggedIn)
{
//Do your office work....
}
else
throw new InvalidOperationException("Login failed for office user.");
}
finally
{
if (codeImpersonate != null)
codeImpersonate.UndoImpersonation();
codeImpersonate = null;
}
Um den obigen Code an mehreren Stellen zu verwenden, hier ist eine Fassade:
public class ImpersonateServices
{
public ImpersonateServices(String userName, String domain, String password)
{
this.UserName = userName;
this.Domain = domain;
this.Password = password;
}
public string UserName { get; private set; }
public string Domain { get; private set; }
public string Password { get; private set; }
public void Execute(Action privilegedAction)
{
CodeImpersonate codeImpersonate = null;
try
{
codeImpersonate = new CodeImpersonate();
var isLoggedIn = codeImpersonate.ImpersonateValidUser(this.UserName, this.Domain, this.Password);
if (isLoggedIn){
privilegedAction();
}
else
throw new InvalidOperationException("Login failed for office user.");
}
finally
{
if (codeImpersonate != null)
codeImpersonate.UndoImpersonation();
codeImpersonate = null;
}
}
}
es verwenden möchte:
var impersonateServices = new ImpersonateServices(AppConfigs.OfficeUser,
AppConfigs.OfficeUserDomain,
AppConfigs.OfficeUserPass);
impersonateServices.Execute(() => {
//Do your Office work...
});
Die Büro -User sollte ein gültiges lokales oder Domänenkonto sein. Um zu testen, ob das Office-Benutzerkonto funktioniert, melden Sie sich mit diesem Benutzerkonto-Berechtigungsnachweis beim Server an und starten Sie die MS-Word-Anwendung. Wenn das Word zum ersten Mal geöffnet wird, wurden möglicherweise einige Popup-Einstellungen angezeigt. Beheben Sie sie, andernfalls können Probleme beim programmgesteuerten Zugriff auftreten.
Wenn Sie die Anmeldeinformationen für den Benutzeraccount in der Konfigurationsdatei speichern, sollten Sie die Werte verschlüsseln.Siehe unten stehende SO Q & A:
How to encrypt one entry in web.config
Encrypting appSettings in web.config
Hope this ...
Huh? Ist auf Ihrem Server Word installiert? – KingCronus
Überprüfen Sie den Dienst von der Clientseite aus, möglicherweise liegt ein Problem mit den Zugriffsrechten vor – Likurg
Sie sollten die Office-Interop-Bibliothek nicht für Serveranwendungen verwenden. Es verstößt gegen die Empfehlung von Microsoft, da es möglicherweise Deadlocks und andere Unannehmlichkeiten gibt, die Ihre Bewerbung vollständig vereiteln. – Leonard