bo.EngWorkBench...disappeared

For some reason I can no longer find bo.EngWorkBench in my Production Environment. If I go to my Test Environment, it is right there in Service Security Maintenance (shown in the image below):

However, if I try to pull it up in my Production Environment, it cannot be found.

I have looked on the server, specifically in the paths for each app server, and both have the EngWorkBench dll’s and XML files. The sizes are identical, as well as the datestamps.

I am using an account with the “Security Manager” box checked in User Options, leading me to believe it is not an issue with permissions.

Where would I begin to look to determine why I can’t open it in Production? It has me absolutely stumped. It is not isolated to a single computer, nor to a single account.

Are you typing the Service ID in, or searching for it. If It shows when searching for it, then my guess would be that it’s not the the service isn’t found, but rather a related record. Probably a Group or user that was specified, nut no longer found.

What do the Details of that error message show?

Try turning Tracing on, and see if anything jumps out at you.

I have tried searching for it,using “Starting at:” as bo.eng, and it doesn’t show:

So, I tried by using “Return All Rows”, and it would appear after the highlighted row in the image below, but as you can see, it doesn’t :frowning:

I did a packet trace earlier, and this is all that I could see that related to the EngWorkBench:

<tracePacket>
  <businessObject>Ice.Proxy.BO.ObjectSecurityImpl</businessObject>
  <methodName>GetByIDEx</methodName>
  <appServerUri>net.tcp://mercury/E10Production/</appServerUri>
  <returnType>Ice.Tablesets.ObjectSecurityTableset</returnType>
  <localTime>9/22/2020 10:50:02:3404314 AM</localTime>
  <threadID>1</threadID>
  <executionTime total="26" roundTrip="25" channel="0" bpm="0" other="1" />
  <retries>0</retries>
  <parameters>
    <parameter name="secCode" type="System.String"><![CDATA[bo.EngWorkBench]]></parameter>
    <parameter name="pcComp" type="System.String"><![CDATA[]]></parameter>
    <parameter name="strictPrimKey" type="System.Boolean"><![CDATA[False]]></parameter>
    <parameter name="CallContext" type="Ice.Bpm.Context.ContextDataSet">
      <ContextDataSet xmlns="http://www.epicor.com/Ice/300/Bpm/Context">
        <BpmData>
          <SysRowID>00000000-0000-0000-0000-000000000000</SysRowID>
        </BpmData>
      </ContextDataSet>
    </parameter>
  </parameters>
</tracePacket>

This is an expanded view of the error dialog:


Full text is as follows:
Business Layer Exception

Record not found

Exception caught in: Epicor.ServiceModel

Error Detail 
============
Description:  Record not found
Program:  Ice.Services.BO.ObjectSecurity.dll
Method:  GetByIDEx
Line Number:  211
Column Number:  17
Table:  Security
Server Trace Stack:     at Ice.Services.BO.ObjectSecuritySvc.GetByIDEx(String secCode, String pcComp, Boolean strictPrimKey) in c:\_Releases\ICE\3.1.600.0\Source\Server\Services\BO\ObjectSecurity\ObjectSecurity.cs:line 211
   at Ice.Services.BO.ObjectSecuritySvcFacade.GetByIDEx(String secCode, String pcComp, Boolean strictPrimKey) in c:\_Releases\ICE\3.1.600.0\Source\Server\Services\BO\ObjectSecurity\ObjectSecuritySvcFacade.cs:line 71
   at SyncInvokeGetByIDEx(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at Epicor.Hosting.OperationBoundInvoker.InnerInvoke(Object instance, Func`2 func) in C:\_Releases\ICE\3.1.600.15\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 59
   at Epicor.Hosting.OperationBoundInvoker.Invoke(Object instance, Func`2 func) in C:\_Releases\ICE\3.1.600.15\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 28
   at Epicor.Hosting.Wcf.EpiOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) in C:\_Releases\ICE\3.1.600.15\Source\Framework\Epicor.System\Hosting\Wcf\EpiOperationInvoker.cs:line 23
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
   at System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
   at System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
   at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
   at System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.SecurityChannelListener`1.ReceiveItemAndVerifySecurityAsyncResult`2.InnerTryReceiveCompletedCallback(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.TransportDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state)
   at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
   at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
   at System.Net.Security.NegotiateStream.ProcessFrameBody(Int32 readBytes, Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.NegotiateStream.ReadCallback(AsyncProtocolRequest asyncRequest)
   at System.Net.AsyncProtocolRequest.CompleteRequest(Int32 result)
   at System.Net.FixedSizeReader.CheckCompletionBeforeNextRead(Int32 bytes)
   at System.Net.FixedSizeReader.ReadCallback(IAsyncResult transportResult)
   at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously)
   at System.ServiceModel.Channels.ConnectionStream.IOAsyncResult.OnAsyncIOComplete(Object state)
   at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e)
   at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags)
   at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)



Client Stack Trace 
==================
   at Epicor.ServiceModel.Channels.ImplBase`1.ShouldRethrowNonRetryableException(Exception ex, DataSet[] dataSets)
   at Ice.Proxy.BO.ObjectSecurityImpl.GetByIDEx(String secCode, String pcComp, Boolean strictPrimKey)
   at Ice.Adapters.ObjectSecurityAdapter.GetByIDEx(String pcSecCode, String pcComp, Boolean strictPrimKey)
   at Ice.UI.App.ObjectSecurityEntry.Transaction.GetByID(String ID)

I also ran the BL Tester against Ice.Contracts.BO.ObjectSecurity.dll (as referenced in the error dialog), and when I run it on my Test environment and look through the results, I see bo.EngWorkBench. However, I see no such result when I run it on my Production environment.


(It would appear between the highlighted rows…which it does when I run it on Test)

I know this is two years old… but was there a resolution? I have the same issue with bo.EngWorkBench (and a few others) not appearing in Service Security Maintenance. I, too, am a system administrator.

We had restricted access in a previous version of Epicor (we are now on 10.2.700.6) and I did check the restrictions after the upgrade but I did not check to see if the services were still listed in Service Security Maintenance.

Submitted to Epicor, but all they have done thus far is to suggest that I create a BAQ on the security table to see what services are there. I did that and bo.EngWorkBench IS there (I knew it would be), but that does not help me get to it in Service Security Maintenance.

Any thoughts?

@skhayatt - This is a small SQL script that I have tucked away for when that happened at my previous employer (I have since switched jobs and it does not happen with my new employers Epicor setup).

As with any direct SQL, run at your own risk. I did put a BEGIN TRANSACTION and ROLLBACK statement in this as a failsafe. Those statements will need to be removed/commented out before the script will make any permanent changes.

Every single line is documented explaining exactly what it does

-- THIS WILL FIX THE ISSUE WHEN bo.EngWorkBench FAILS TO APPEAR IN THE "Service Security Maintenance" Menu

-- WE USE 'START TRANSACTION' SO THAT WE CAN ROLLBACK ALL CHANGES ONCE TESTING IS COMPLETE
BEGIN TRANSACTION

-- CHANGE THIS TO MATCH YOUR DATABASE 
USE [E10Test] 

-- SELECT THE CURRENT STATE OF THIS TABLE IN THE DATABASE SO WE CAN SEE THE ERROR EXISTS. 
-- THE ISSUE WILL PRESENT ITSELF BY HAVING [ParentSecCode] set to 'MENU' FOR bo.EngWorkBench
SELECT ParentSecCode FROM [E10Test].[Ice].[Security] WHERE SecCode = 'bo.EngWorkBench'

-- BEGIN THE UPDATE STATEMENT, INDICATING THAT WE ARE GOING TO BE WORKING IN THE Ice.Security TABLE
UPDATE [Ice].[Security] 

-- INDICATES THAT WE WILL BE UPDATING THE FIELD [ParentSecCode] WITH THE VALUE OF 'OBJECT' IN THE Ice.Security TABLE
SET [ParentSecCode] = 'OBJECT'

-- STATES TO ONLY UPDATE THE FIELD IF [SecCode] = 'bo.EngWorkBench', [Description] = 'bo.EngWorkBench', 'ParentSecCode = 'MENU', and 'SystemCode' = 'ERP'
WHERE SecCode = 'bo.EngWorkBench' AND Description = 'bo.EngWorkBench' AND ParentSecCode = 'MENU' AND SystemCode = 'ERP' 

-- RUN THE SAME SELECT STATEMENT FROM ABOVE, TO ENSURE THAT THE CHANGES TOOK PLACE FIXED THE ISSUE. 
-- CHANGES WILL BE REFLECTED BY [ParentSecCode] BEING SET TO 'OBJECT' INSTEAD OF 'MENU'
SELECT ParentSecCode FROM [E10Test].[Ice].[Security] WHERE SecCode = 'bo.EngWorkBench'

-- ROLLBACK ALL CHANGES MADE. THIS IS DONE AS A FAILSAFE, ON THE OFFCHANCE THAT THE ABOVE STATEMENTS FAIL TO MAKE THE DESIRED CHANGES.
ROLLBACK 

/*
* After running the above statements, check the results that will be displayed in the Results pane below. 
* If ParentSecCode is set to 'OBJECT' in the 2nd set of results, then we know that the statements will work.
* At this time, the BEGIN TRANSACTION and ROLLBACK statements can be commented out using '--' at the beginning of those 2 lines.
* When you run the script again script again, it will perform all of the same tasks but it will NOT rollback the transaction to its previous state when complete.
* You will see in the output of the script that the changes have been applied
* In Epicor you will now see bo.EngWorkBench listed in the "Service Security Maintenance" Menu

* The local Epicor client DOES NOT need to be restarted
* "Regenerate Datamodel" DOES NOT need to take place
* The Application Server DOES NOT need to be restarted
* The changes DO take effect immideately.
*/
1 Like

Wow. Thanks. Will hold onto this just in case. Submitted to Epicor and they sent a .cab file which did not do anything that I can see, so will it it run its course with them.

Any idea what causes this?

I was never able to figure out the root cause before I left that company. But, it is something that is still irritating the hell out of me…I can think of nothing that would be triggering that, and not knowing is, well, as I said…Irritating! :slight_smile: