我不想就使用Microsoft Office执行此任务的优点进行辩论。我无休止地争辩说,这不是实现这一目标的方法,但是在很多场合都会超越我的力量。我也理解Microsoft不建议使用此方法并且不支持它。但我在这里......。
问题:我创建了一个控制台应用程序,通过使用密码对文件进行加密来处理文件,以便通过电子邮件发送。我没有使用iTextSharp处理图像和PDF的问题,但处理office文档时有一个奇怪的问题。当我逐步完成工作室时,无论我登录的是哪个活动目录帐户,他们都会毫无问题地处理。部署时,Office文档除非在我的AD帐户下运行,否则不会处理。我确切地知道错误的产生位置。这是下面的代码。
private void PasswordProtectWord(Datapassedin pa)
{
int num = 0;
try
{
Microsoft.Office.Interop.Word._Application objWord = null;
_Document objDoc = null;
objWord = (Microsoft.Office.Interop.Word.Application)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("000209FF-0000-0000-C000-000000000046")));
objWord.Visible = false;
objWord.DisplayAlerts = WdAlertLevel.wdAlertsNone;
objWord.DisplayAutoCompleteTips = false;
objWord.DisplayDocumentInformationPanel = false;
objWord.DisplayRecentFiles = false;
objWord.ScreenUpdating = false;
object objValue = Missing.Value;
object objMissing = Type.Missing;
object docName = pa.DocName;
object password = pa.Password;
object passwordProtectedDocName = pa.Password_Protected_DocName;
object objTrue = true;
object objFalse = false;
object objReadOnly = configvalue.ObjReadOnly;
// open statement below does not open
objDoc = objWord.Documents.Open(ref docName, ref objValue, ref objReadOnly, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objFalse, ref objValue, ref objValue, ref objValue, ref objValue);
// null object error is thrown here when we attempt to activate. I discovered this by placing flags in the code line
objDoc.Activate();
objDoc.SaveAs2(ref passwordProtectedDocName, ref objValue, ref objValue, ref password, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue, ref objValue);
objDoc.Close(objTrue, Type.Missing, Type.Missing);
Marshal.ReleaseComObject(objDoc);
objWord.Quit(objFalse, Type.Missing, Type.Missing);
Marshal.ReleaseComObject(objWord);
}
catch (Exception ex)
{
UpdateErrorLogAndSendEmail(string.Format("{0} And {1} - {2} - {3}", ex.Message, ex.InnerException.Message, num.ToString(), pa.Password_Protected_DocName), ex.Source, "", configvalue.Bcc);
}
}
好的,这里是我采取的一些步骤,尽管是采取极端步骤来解决问题。
我们尝试使用服务ID而不是我自己的帐户重建整个项目。然后使用部署代码的服务ID登录服务器并创建控制台作业。
这不仅不起作用,它还通过允许控制台应用程序在我的ID用作AD权限时运行来重复该行为。
尝试将我的AD帐户的所有权限复制到服务ID。与上述结果相同。
要考虑的事项:
这个问题的一个问题是我甚至不确定在搜索答案时要搜索什么。