Task Sequence Stops at UDI Wizard
Im using configmgr 2012 R2 with MDT integration. I have a task sequence that is getting stuck on the UDI wizard stage. In the progress bar it just gets stuck at UDI Wizard and gets no further. the smsts log stops at "mapping server
share" the user logged in has permissions to that drive and I can browse it.
I have used this udi wizard in other task sequences before. any ideas on where to look?
log file located at
http://www.filedropper.com/smsts11
I'm having a pretty similar problem. I have a task sequence to capture user state and at the end, there is a section to copy logs. The task sequence just stops there.
The last line in smsts.log is "Mapping server share: \\server\share$".
The last line in zticopylogs.log is "Mapping server share: \\server\share$".
The last few lines in BDD.log are...
Microsoft Deployment Toolkit version: 6.2.5019.0 Wizard 2/21/2014 1:49:50 PM 0 (0x0000)
The task sequencer log is located at C:\WINDOWS\CCM\Logs\SMSTSLog\SMSTS.LOG. For task sequence failures, please consult this log. Wizard 2/21/2014 1:49:50 PM 0 (0x0000)
Not Wizard = True Wizard 2/21/2014 1:49:50 PM 0 (0x0000)
Property UserCredentials is now = False Wizard 2/21/2014 1:49:50 PM 0 (0x0000)
Validate Against UNC: \\server\share$ Wizard 2/21/2014 1:49:50 PM 0 (0x0000)
Validate Against UNC: \\server\share$ Wizard 2/21/2014 1:49:50 PM 0 (0x0000)
It hangs pretty much indefinitely. I'm really stumped on this one because there aren't error codes or anything else to look up.
Similar Messages
-
Build and capture task sequence stops after apply windows updates
Hi
SCCM 2012 SP1 CU4. Deploying Windows 7 SP1.
Pulling my hair out over this one. I successfully performed a build and capture installing some applications. When I choose to install Windows updates, the updates install, the system reboots then doesn't continue. Applications don't install, image isn't captured.
I've tired using the default B&C TS and receive the same results. I've amended the TS to as follows, as suggested in a technet forum post: https://social.technet.microsoft.com/Forums/en-US/a535e509-fc6a-483c-bf24-7e2aa064e5b7/deploying-100-of-available-software-updates-during-a-task-sequence?forum=configmanagerosd
Looking at smsts.log there's errors relating to not accepting the license agreement, but I didn't think this would stop the TS.
Can someone point out why the deployment stops?
https://dl.dropboxusercontent.com/u/23479177/smsts-20141113-182413.log
CheersThis is very common scenario you´re having! :)
For OSD and for Capture I always create myown Software Update Group, which lets me totally control, what updates goes to the image and which doesn´t. I then edit membership of update and tag or un-tag update to the group.
I suggest you do the following:
1. Create manual Computer record and add it to OSD Capture collection.
2. Create SUG for OSD Capture and un-tag updates which are listed in KB2894518. But that might not be enough.
3. Deploy TS to the OSD Capture collection.
4. Create/modify virtual machine with MAC matching the computer record.
5. Run PXE and hook Capture TS. -
MDT 2013 Windows 8.1 Task sequence Stops After first Reboot. login
Hi There,
The issue I am having is that After the OS gets laid down, and the Windows 8.1 computer reboots, The task sequence does not continue. It fails everytime. There are not any obvious errors that happen in the process that I can see in the logs. But I have
customized this process quite a bit and I could use some help. We are deploying potentionally to over 30,000 computers.
The test machine I have been using is the Surface pro 2.
The interesting part is after a failure is if I start the process over again , boots into PE, then run diskpart manually from command prompt to Clean Disk 0, and then reboot and start the MDT task sequence, it will deploy fine.
I also have a custom step that copies the TS media from the stick to a Recovery partition I create. The user can launch a -re-image or MDT refresh from an Icon/script, which will unhide this "recovery partition", and kick off a lite touch refresh.
This works succesfully everytime. We have remote locations with very slow links, so MDT over the network or MDT integrated with SCCM is not an option at this time. So this is the solution.
I am attempting to use MDT 2013 to deploy Windows 8.1 Offline, and using GPT partitions.
I am using a custom Format and partiition Step, that call the CustomDiskpart.txt script from %deployroot%\Scripts.
I am also using a Split image, as multi partitioned EFI/NTFS USB sticks are not a possibility for us , also, the USB sticks capable of this are seen by MDT as a "fixed drive" anyways. Which can cause issues in itself. So the LTIAPPLY.wsf has
been edited to search and apply ther split .swm files. This works well.
After the Task sequence failure I have tried launching the Litetouch scripts from the C:\MINNINT folder manually to continue the sequence, but it doesnt do anything.
I don't want to always be running Diskpart manually before imaging a new OEM computer. I needa second pair of eyes on this.
Thank You in advance!Hi,
Thanks Again for taking a look.
I checked the sysprep log in the image and they look fine. No errors.
As requested here are some logs. Let me know if I can provide anything else.
BDD.log
litetouch.log
SMSTS.log
Im not actually attempting to provide a recovery image. What I am doing is leveraging MDT to refresh the computer remotely. We can update the MDT media on the hidden data partition,when required and kick it off remotely. Some of the computers are very
remote, and without SCCM DP's, plus a combination of slow links and a lack of deskside techs made this a requirement. This works without incident.
The only issue I have is on a new computer if I run the sequence (offline USB media) it will fail the first time, unless I run a diskpart clean in PE first.. Then it will succeed. Refreshing the computer is fine. -
KeyboardLocale and SystemLocale during UDI Wizard (MDT 2013)
Hi
We're using SCCM 2012 R2 integrated with MDT 2013
we deploy Windows 7 with Task Sequence process with UDI Wizard
we have 2 main problems regarding the Language Settings
1. in the wizard we define UserLocale, KeyboardLocale and UILanguage, OSDTimeZone
what about SystemLocale ? which is very basic to set, but there is no built-in combobox for it.
the only workaround I can come up with is to build a custom page with that setting but it is hard to create a combobox with all the available languages, even when editing the XML directly and not via the UI.
2. if I set the KeyboardLocale to Hebrew for example in the Wizard, the SMS environment variable is set to 0409:0000040d
this causes the deployment to end with Hebrew installed with US keyboard layout. which is wrong!
I expect the value to be 040d:0000040d (Hebrew keyboard with Hebrew layout)
which brings me to another question... how can I define multi keyboards? because my actual goal is to have English as my default keyboard language and to have Hebrew as a secondary keyboard.
it is not Hebrew in particular. we deploy Windows in 20 different sites worldwide and English should be always be the default language and we want to add another local additional language
I added a script that modifies the keyboardlocale and converts it from 0409:00000### to 0409:00000409;0###:00000###, but I feel like it is too much for this little setting that should be so basic...
any help will be appreciated. thanks
Tamir LevyHi,
Here is video for your reference.
Configuring MDT 2012 UDI Replace Computer Scenario
http://technet.microsoft.com/en-us/video/configuring-mdt-2012-udi-replace-computer-scenario
We
are trying to better understand customer views on social support experience, so your participation in this
interview project would be greatly appreciated if you have time.
Thanks for helping make community forums a great place. -
UDI OSD Task Sequences started failing with 0x80070002 error in SCCM 2012
This is kind of long, but here goes...
We built a UDI task sequence in SCCM 2012 (with MDT integration) that we were testing for deployment of a couple of different Win7 images. We customized the UDI experience thru the UDI wizard and XML file and OS deployment worked as expected
thru the task sequence (testing on Hyper-V VMs). Recently, this UDI TS started failing with error 0x80070002 during what appears to be the "Use Toolkit Package" step. This is after the OS image has already been laid down and after the ConfigMgr
client has been installed/configured. The SMSTS.log reports "Failed to open the task sequence key HKLM\Software\Microsoft\SMS\Task Sequence. Error code 0x8007002" Among other errors...I will post the entire log below...
After the error during deployment, Win7 will boot normally, however, you have no network connectivity and it appears the proper network driver didn't get loaded in the OS. Combine this with the fact that the TS should have joined the machine to our domain,
but you can't login because no network.. Im not sure if the network issue is a product of the TS failing early or the actual cause of the TS failure.
Anyway, I attempted to build another UDI task sequence using the same boot image and toolkit/settings packages, but am experiencing the same error during deployment. We have a few OSD task sequences built without UDI and those all still work just fine.
So, I am at a loss for where the root problem lies. Any suggestions or assistance would be greatly appreciated.
Here is the entire SMSTS.log and BDD.log...
https://skydrive.live.com/redir?resid=D65B1C4362892A26!110&authkey=!AKu5mOvDsXaEgvc
Thanks
Richie Tenhetyour failure does appear to be network (driver or otherwise) or dns related and it cannot contact the management point FQDN just around the time where it should download and execute the
Use Toolkit Package step...
"Starting Task Sequence Engine . . . "
"Non fatal error 0x80072ee7 in sending task sequence execution status message to MP"
"Start executing an instruciton. Instruction name: Use Toolkit Package. Instruction pointer: 83"
"unknown host (gethostbyname failed)"
"sending with winhttp failed; 80072ee7"
"Tried all the available http based locations. SMB based locations will be attempted now."
"Failed to resolve the source for SMS PKGID=P0100015, hr=0x80070002"
"Failed to run the action: Use Toolkit Package.
The system cannot find the file specified. (Error: 80070002; Source: Windows)"
that said, check that the package referenced above actually exists and is the correct source version on your distribution points, also verify (press F8 and check can you ping the FQDN of your management point) that you have network connectivity
around the time of the failure.
Step by Step Configuration Manager Guides >
2012 Guides |
2007 Guides | I'm on Twitter > ncbrady -
Task Sequence to create VHD doesn't finish.
I have been putting together a task sequence on our new SCCM 2012 server to create a Win7 VHD using the new features in SCCM 2012 R2 to deploy an OS to a VHD. The task sequence stops after the "Setup Windows and Config Manager" Step. It
doesn't run the shutdown step. I have been trying to insert steps to run sysprep and they are never run either. I can manually shutdown the VM and the process completes but I need it to finish the task sequence so that I can eventually install
additional software.
The only error I can see in the SMSTS log on the VM is "Failed to create instance for IMTCTokenHandler interface, hr=0x80070005".
I'm using the default task sequence to create the "Install an existing image package to a virtual hard disk". I've tried using an already created image as well as the OS Source. SCCM 2012 R2, Windows 8.1 ADK. I have tried recreating that task
sequence a number of different times.The sysprep error may be caused by the rearm count being reached.
You may run the sysprep command too many times on this referenced Windows. Try on a fresh one.
Juke Chou
TechNet Community Support -
UDI Wizard - Task Sequence Variables.
Quick question :-)
How are the variables defined in UDI applied during an OS installation ?
And does it take precedence over Collection variables ?
Thx
RgdsNot sure what you about "how they are applied"? Variables, aren't "applied", they are set. Variables simply contain a value and typically "something" uses the value of the variable. Now, what that "something" is depends
upon the variable itself (if anything -- just because a variable has a value doesn't mean anything actually uses that value). And what that "something" does with the value is up to that "something".
Many -- not all task sequence variables -- are used by the various processes/exes that correspond to the various steps in the task sequence. In fact, all the task sequence editor does is set a bunch of variables that are in turn used by the steps in your
task sequence (the task itself is represented by a variable).
Thus, any values you set in the TS editor are set at "design" time and passed to the TS engine when it starts on a target client. Any values set during the execution of the TS are "run" time variables and will over write the value of
any like named variables created before they are set including design time variables since they were set at the beginning of the TS.
Collection variables, like design time variables, are set at the start of the TS execution and thus are over-written by any subsequent setting of the same variable within the execution of the TS.
Jason | http://blog.configmgrftw.com | @jasonsandys -
Hi,
Environment ConfigMgr 2012 R2
Replace Scenario: Capture data to a USB external drive and Restore it from USB external drive.
Steps taken:
1) Created Computer Association with New computer and Source computer
2) Deployed UDI replace Task Sequence to Source computer and captured data to a USB external drive
3) Run UDI Task Sequence from Boot Media to Restore data from USB External drive which had the captured data.
Issue:
My task sequence failed to restore data from USB external drive.
Is there a fix
Any help is greatly appreciated it.I created a query to see the deployment logs in real time. I see the TS fails when running "Request State Store" task. Here are the logs.
Severity Type Site code Date / Time System Component Message ID Description
Error Milestone POK 7/22/2014 4:13:15 PM MININT-P6E4T6G Task Sequence Engine 11141 The task sequence execution engine failed execution of a task sequence. The operating system reported error 1: Incorrect function.
Error Milestone POK 7/22/2014 4:13:15 PM MININT-P6E4T6G Task Sequence Engine 11135 The task sequence execution engine failed executing the action (Error in the task sequence) in the group (Gather Logs and StateStore on Failure)
with the error code 1 Action output: [ smsswd.exe ] PackageID = '' BaseVar = '', ContinueOnError='' ProgramName = 'cscript "C:\_SMSTaskSequence\WDPackage\scripts\ztierrormsg.wsf"' SwdAction = '0001' Set command line: Run command line Working dir 'not
set' Executing command line: Run command line Process completed with exit code 1 Microsoft (R) Windows Script Host Version 5.8 Copyright (C) Microsoft Corporation. All rights reserved. Microsoft Deployment Toolkit version: 6.2.5019.0 The task sequencer
log is located at C:\WINDOWS\CCM\Logs\SMSTSLog\SMSTS.LOG. For task sequence failures, please consult this log. ZTI deployment failed, Return Code = 1 Command line returned 1. The operating system reported error 1: Incorrect function.
Information Milestone POK 7/22/2014 4:13:14 PM MININT-P6E4T6G Task Sequence Engine 11134 The task sequence execution engine successfully completed the action (Copy Logs) in the group (Gather Logs and StateStore on Failure)
with exit code 0 Action output: ... 扴捡杫潲湵潬潴尠停䭏偃䍓䵃卐䍜彍潓牵散尤协屄潌獧䍜剏ⵐ䠳䑗塐就瑺獩瑥慢正牧畯摮氮杯潃祰湩㩃坜义佄南䍜䵃䱜杯屳䵓呓䱓杯穜楴慴潴潬潴尠停䭏偃䍓䵃卐䍜彍潓牵散�潌獧䍜剏ⵐ䠳䑗塐就潃祰湩㩃坜义佄南䍜䵃䱜杯屳䵓呓䱓杯作䑓敓畴坰穩牡潬潴尠停䭏偃䍓䵃卐䍜彍潓牵散尤协屄潌獧䍜剏ⵐ䠳䑗塐就协卄瑥灵楗慺摲氮杯潃祰湩㩃坜义佄南停湡桴�潬潴尠停䭏偃䍓䵃卐䍜彍潓牵散尤协屄潌獧䍜剏ⵐ䠳䑗塐就慐瑮敨屲湕瑡整摮䍇潃祰湩潬㩃坜义佄南䍜䵃䱜杯屳䵓呓䱓杯䉜䑄氮杯挠湯整瑮潴尠停䭏偃䍓䵃卐䍜彍潓牵散尤协屄潌�Console
> Successfully resized the shadow copy storage association Return code from command = 0 Cleaning up default wallpaper registry keys Process completed with exit code 0 zticopylogs processing completed successfully. Command line returned 0.
Information Milestone POK 7/22/2014 4:13:07 PM MININT-P6E4T6G Task Sequence Engine 11134 The task sequence execution engine successfully completed the action (Move State Store) in the group (Gather Logs and StateStore on Failure)
with exit code 0 Action output: [ smsswd.exe ] PackageID = '' BaseVar = '', ContinueOnError='' ProgramName = 'cscript.exe "C:\_SMSTaskSequence\WDPackage\scripts\ztimovestatestore.wsf"' SwdAction = '0001' Command line for extension .exe is "%1" %* Set
command line: Run command lineWorking dir 'not set' Executing command line: Run command line Process completed with exit code 0 Microsoft (R) Windows Script Host Version 5.8 Copyright (C) Microsoft Corporation. All rights reserved. Microsoft Deployment
Toolkit version: 6.2.5019.0 The task sequencer log is located at C:\WINDOWS\CCM\Logs\SMSTSLog\SMSTS.LOG. For task sequence failures, please consult this log. ztimovestatestore processing completed successfully. Command line returned 0.
Information Milestone POK 7/22/2014 4:13:07 PM MININT-P6E4T6G Task Sequence Engine 11134 The task sequence execution engine successfully completed the action (Gather) in the group (Gather Logs and StateStore on Failure) with
exit code 0 Action output: ... (BIOS is 'DELL - 1072009'). Property IsVM is now = False Finished getting virtualization info Connection succeeded to MicrosoftVolumeEncryption There are no encrypted drives Property IsBDE is now = False Processing
the phase. Determining theINI file to use. Using COMMAND LINE ARG: Ini file = CustomSettings.ini Finished determining the INI file to use. Added new custom property MYCUSTOMPROPERTY Using from [Settings]: Rule Priority = DEFAULT ------ Processing the
[DEFAULT] section ------Process completed with exit code 0 ------ Done processing CustomSettings.ini ------ Remapping variables. Property TaskSequenceID is now = Property DeploymentType is now = NEWCOMPUTER Finished remapping variables. ZTIGather processing
completed successfully. Command line returned 0 ReleaseSource() for C:\_SMSTaskSequence\Packages\POK0000F. reference count 1 for the source C:\_SMSTaskSequence\Packages\POK0000F before releasing Released the resolved source C:\_SMSTaskSequence\Packages\POK0000F.
Information Milestone POK 7/22/2014 4:13:03 PM MININT-P6E4T6G Task Sequence Engine 11130 The task sequence execution engine skipped the action (Use Toolkit Package) in the group (Gather Logs and StateStore on Failure) because
the condition was evaluated to be false.
Information Milestone POK 7/22/2014 4:13:02 PM MININT-P6E4T6G Task Sequence Engine 11134 The task sequence execution engine successfully completed the action (Set Error Code) in the group (Gather Logs and StateStore on Failure)
with exit code 0 Action output: Finished with error code 0.
Information Milestone POK 7/22/2014 4:13:02 PM MININT-P6E4T6G Task Sequence Engine 11124 The task sequence execution engine started the group (Gather Logs and StateStore on Failure).
Information Milestone POK 7/22/2014 4:13:02 PM MININT-P6E4T6G Task Sequence Engine 11122 The task sequence execution engine skipped the group (Cancelled Wizard Group) because the condition was evaluated to be false.
Error Milestone POK 7/22/2014 4:13:02 PM MININT-P6E4T6G Task Sequence Engine 11135 The task sequence execution engine failed executing the action (Connect to State Store) in the group (State Restore) with the error code 1
Action output: ... ( 0x80070035 ) , trying to connect without username. The network path was not found. Unable to connect to
\\3807000000100000000000:\2fa390ff58558b49c45bf204dfa5717f. Sleeping for 15 seconds. Unable to connect to share: The network path was notfound. ( 0x80070035 ) , trying to
connect without username. The network path was not found. Unable to connect to
\\3807000000100000000000:\2fa390ff58558b49c45bf204dfa5717f. Sleeping for 20 seconds. Unable to connect to share: The network path wasnot found. ( 0x80070035 ) , trying to
connect without username. The network path was not found. Unable to connect to
\\3807000000100000000000:\2fa390ff58558b49c45bf204dfa5717f. Sleeping for 25 seconds. Process completed with exit code 1 ERROR - Unable to map a network drive to
\\3807000000100000000000:\2fa390ff58558b49c45bf204dfa5717f. Unable to connect to 563807000000100000000000:\2fa390ff58558b49c45bf204dfa5717f ZTI ERROR - Non-zero return code by ZTIConnect,
rc = 1 Command line returned 1. The operating system reported error 1: Incorrect function.
Warning Milestone POK 7/22/2014 4:11:46 PM MININT-P6E4T6G Task Sequence Engine 11138 The task sequence execution engine ignored execution failure of the action (Request State Store) in the group (State Restore).
Error Milestone POK 7/22/2014 4:11:46 PM MININT-P6E4T6G Task Sequence Engine 11135 The task sequence execution engine failed executing the action (Request State Store) in the group (State Restore) with the error code 16389
Action output: ... etting Media Certificate. Sending request to MP
http://abcdefg.xyx.xyz.local. Setting message signatures. Setting the authenticator. CLibSMSMessageWinHttpTransport::Send: URL: abcdefg.xyx.xyz.local:80 CCM_POST /ccm_system/requestRequest was successful. migInfoRequestMessage.DoRequest (m_sResponse,true),
HRESULT=80004005 (e:\nts_sccm_release\sms\client\osdeployment\osdsmpclient\smpclient.cpp,1098) pClientRequestToMP->DoRequest(), HRESULT=80004005 (e:\nts_sccm_release\sms\client\osdeployment\osdsmpclient\smpclient.cpp,2778) ExecuteRestoreRequestToMP(migInfoFromMP),
HRESULT=80004005 (e:\nts_sccm_release\sms\client\osdeployment\osdsmpclient\smpclient.cpp,2903) ExecuteRestoreRequest(), HRESULT=80004005 (e:\nts_sccm_release\sms\client\osdeployment\osdsmpclient\main.cpp,84) OSDSMPClient finished: 0x00004005 reply from server
is 'NoReply' ClientRequestToMP::DoRequest failed (0x80004005). ExecuteRestoreRequestToMP failed (0x80004005). ExecuteRestoreRequest failed (0x80004005).. The operating system reported error 1: Incorrect function. -
How can I stop a task sequence if a custom HTA preflight check fails?
In our currently deployment method, we launch an HTA program before initiating the OSD process. This is only when run from the RAP menu, not via PXE. When a user initiates OSD through that menu, they get a message prompting them to close Outlook, and
a countdown of 5 mins, then OSD starts. They also have the ability to click on an 'OK' button to proceed on their own.
I've created a new script which checks WMI if Outlook and/or OCS are open, and if the machine is running on battery, spit out a "Failed" response and stop the HTA. I've also added a "recheck" button to re-do the check, and an 'OK
button if people jsut want to continue.
I'm curious if there is a way to prevent the task sequence from continuing if any of those conditions arent met. Currently it just pops up and says "Failed, Cannot conitue", but if they close the window, the task sequence thinks the program
has run, and the OSD migration starts. I'd like to be able and get the script to cancel the OSD process if a check fails.
Has anyone had success with this, using WINXP? I'd use the MS pre-flight check but it's only for WIN7.Interesting. Thanks for the response. Is there anybody out there that can assist with VBS part of the solution?
Here's the code I'm working with. Currently the battery piece isnt working as it should but I can figure that our, eventually. I'd like to get Jason's proposed solution in the code. If this isn't the right place, I'll take this somewhere
else.
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>OSD Preflight checks</title>
<HTA:APPLICATION
APPLICATIONNAME="OSD Preflight checks"
ID="objOSDPreReqChecks"
SCROLL="no"
CONTEXTMENU="no"
SINGLEINSTANCE="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
WINDOWSTATE="normal"/>
<!-- #region STYLEs-->
<style type="text/css">
H1{color:Black;text-align:center;font-family: Arial, Helvetica, sans-serif;font-size: 26px;}
p{font-family:"Arial";font-size:10px;}
fail{color:Red;text-align:center;}
.Version {float:left; font-size:1.0em;font-style:italic;color:#888888;font-weight:bold;}
.Header1 {width: 180px; text-align: right;font-weight:bold;}<!-- '1st column heading -->
H2 {font-family: Arial, Helvetica, sans-serif; text-align: center;}
H3 {font-style: italic;}
.style2 {width: 180px; text-align: left;}
.Header2 {width: 150px; text-align: right;font-weight:bold;}<!-- '2nd column heading -->
.style4 {width: 410px; text-align: left;}
.StatusBar
font-family: Arial, Helvetica, sans-serif;
text-align: center;
.hidden {display: none; visibility: hidden;}
</style><!-- #endregion -->
</head>
<script language="VBScript" type="text/vbscript">
'======================================================================================
' Script
' Version
' Purpose To check a machine is suitable for taking an OS deployment
'======================================================================================
'Features
' Modular design
' Verbose "Debug Mode"
' In-built data validation
' Custom error handling
' Custom error codes - 90x0
' Generic WMI handler
'BUGfix: Change CLng to CDbl to avoid overflow (in GetRAM)
'fixed - moved head section to top to become head > script > body
'fixed - fCheckModel display with leading ,
'fixed - fgetmodels dictionary list
Option Explicit
' #region GLOBAL DECLARATIONS: Persistent fold region
'======================================================================================
'GLOBAL Vars
'Things to just display (in GUI)
Dim strRAM
Dim strCPUInfo
Dim strCPUName
Dim strCPUDesc
Dim iCPUCount
Dim iCPUCoreCount
Dim iRAM
Dim strBIOSver, strBIOSDate, strBIOSInfo
'Time related
Dim TimerInterval 'timer to refresh HTA at start
Dim iTimer 'abort timer
Const iAbortTimeout=300000 'delay before window closes (in milliseconds)
Dim pbTimerID
Dim pbHTML
Dim pbWaitTime
Dim pbHeight
Dim pbWidth
Dim pbBorder
Dim pbUnloadedColor
Dim pbLoadedColor
Dim pbStartTime
'Dictionary
Dim objModelsDict,colKeys,strKey 'models
Dim objApprovedMakesDict
'Misc GLOBAL vars
Dim blnDebug 'set TRUE to trigger debug mode
Dim bAbortBuild 'Boolean flag to abort or not abort
Dim strTemp 'throwaway/scratch
Dim strNamespace 'wmi default namespace for ANY machine
Dim strComputer 'wmi reference to current machine, just .
Dim strService 'WMI service
Dim strQuery 'custom WQL
Dim ErrMsg 'custom error messages
Dim iErrMode 'State machine for error mode
Dim lFlags 'WMI flag
Dim strDisks
'Pre-requisites - things that will cause build to abort if values do not meet spec
Dim strHTAVendor 'Make of hardware
Dim strHTAVendorState
Dim strHTAModel 'Model of hardware
Dim strHTAModelState 'Model state
Dim strHTARAM 'RAM
Dim strHTARAMState 'RAM state
Dim strHTACPUSpeed 'Processor speed
Dim strHTACPUCores 'Number of cores
Dim strHTACPUFullInfo 'CPU + cores
Dim strHTAHDD 'Disk info
Dim strHTAHDDState 'Disk state
Dim strHTACheckRAW 'NTFS check
Dim strHTAArchitecture 'Processor support
Dim strHTAProduct 'Product ID
Dim strHTAOutlook 'Outlook running
Dim strHTAOutlookState 'Outlook state
Dim strHTABattery 'Battery check
Dim strHTABatteryState 'Battery state
'for WQL filters
Dim strWQLPCInfo 'Pre-req - (1) for various inc. domain role (servers)
Dim strWQLRAM 'Pre-req - (2) RAM
Dim strWQLCPU 'Pre-req - CPU speed string (not int)
Dim strWQLBootOrder 'Pre-req - Boot order string
Dim strWQLSATAMode 'Pre-req - HDD mode
Dim strWQLGenericBIOS
Dim strWQLCPUCount 'Pre-req - how many CPUs
Dim strWQLCPUInfo
Dim strWQLFSType 'Pre-req - Check HDD not RAW (i.e. is NTFS)
Dim strWQLDisks 'Disks
Dim strWQLChassis 'Machine type
Dim strWQLID 'Unique code from OEM
Dim strWQLProc 'is Outlook running = False
Dim strWQLBattery 'is on Battery = False
'State
Const cProblem = " Problem!"
Const cRunAgain =" RunCheck: Run System Check Again"
Const cSuccess = " Success!"
Const cPassed=" Pass"
Const cFail=" Fail"
'Pre-requisite to check: SET VALUES HERE vvvvvvvvvvvvvvvv
Const cApprovedOEM="Hewlett-Packard"
Const LegacyOEM1="Dell Inc."
Const LegacyOEM2="IBM"
Const cMinimumMemoryMB = 1000 'RAM in MB
'Const cMinimumMemoryMB = 1000000 'force fail test data RAM in MB
Const cMinFS="NTFS"
' Const cMinFS="HPFS" 'force fail test data
Const iMinCores=1
'Const iMinCores=10099 'force fail cores test data
Const iMinCPUSpeed=2 '20 'in GHz
'Const iMinCPUSpeed=90000 'in GHz
Const iMinCPUArch=32
'Const iMinCPUArch=64
' #endregion
' To hide anything use ID.className = "hidden", to show set to "", e.g. NotFoundArea.className = "hidden"
Sub Window_Onload
Err.Clear
VersionSpan.InnerText = objOSDPreReqChecks.Version 'Get version
self.focus
self.moveTo 100,100 'Move window top left
StatusBar.InnerText="Validating machine..."
document.body.style.cursor = "wait" 'hourglass cursor
'Call PreflightChecks 'use for testing as a VBS only, otherwise HTA timer will call below
TimerInterval = window.setInterval("PreflightChecks",10)
End Sub
Function PreflightChecks
' #region HEADER NOTES: Persistent fold region
'Version history
'ver 5 OCTOBER 2011 - added error handler
'ver 3rd Nov - removed HPonly queries
'// Solution: Custom Script for use with MDT - Adapted from hardwareinfo.vbs Mikael Nystrom – http://deploymentbunny.com
'Typical BIOS content
'Processor Speed = 2133/1066 MHz
'Boot Order = Network Controller,ATAPI CD-ROM Drive,USB device,Hard Drive,Diskette Drive,PnP Device #2,PnP Device #3,PnP Device #4,PnP Device #5,PnP Device #6,PnP Device #7,PnPe #8,PnP Device #9,PnP Device #10,PnP Device #11
'SATA (disk) mode: *IDE,--,RAID,-- or IDE,*AHCI,RAID
'On Error Resume Next
' #endregion
' #region CONSTANTS: Persistent fold region
'======================================================================================
'Fields available in HP BIOS
Const sAsset = "Notebook Asset Tag"
Const sOwner = "Notebook Ownership Tag"
Const sMan = "Manufacturer"
Const sNoteModel = "Notebook Model"
Const sCPU = "Processor Type"
Const sCPUSpeed = "Processor Speed"
Const sRAM = "Memory Size"
Const sModel = "Product Name"
Const sBIOSName ="System BIOS"
Const sBIOSVer = "BIOS Version"
Const sBIOSDate = "BIOS Date"
'Other BIOS stuff you could use too
'Const sOwnerTag = "Enter Ownership Tag"
'Const sBIOS = "PCID"
'Const sBIOS = "Define Custom URL"
'Const sBIOS = "Set Alarm Time"
'Const sBIOS = "PCID Version"
Const TextMode="1" 'text case sensitive for dict obj
'WMI core constants
Const wbemFlagReturnImmediately = 16 'wmi - Causes the call to return immediately.
Const wbemFlagForwardOnly = 32 'wmi - Causes a forward-only enumerator to be returned.
'Forward-only enumerators are generally much faster and
'use less memory than conventional enumerators, but don't allow calls to SWbemObject.Clone_
'Advisory config values - as in "you want to the change these"
Dim strHTABootOrder
Dim strHTASATAMode
'Dim strHTACPU
' #endregion
'======================================================================================
' #region WQL: Persistent fold region
lFlags = wbemFlagReturnImmediately + wbemFlagForwardOnly
'Queries of things to check (HP)
strWQLBootOrder = "select Name, value from HP_BIOSSetting where Name='Boot order'"
strWQLSATAMode = "select Name, value from HP_BIOSSetting where (Name='SATA emulation' or name='SATA device mode')"
strWQLDisks ="SELECT * FROM Win32_DiskDrive where mediatype like 'Fixed%hard disk%'" 'win32_disk only avail after W7
strWQLFSType ="SELECT * from Win32_LogicalDisk where DriveType='3'" 'only bother with HDDs
'Generic WMI query strings
strWQLGenericBIOS="SELECT Manufacturer,SMBIOSBIOSVersion,ReleaseDate FROM Win32_BIOS WHERE PrimaryBIOS = True"
strWQLCPUCount= "SELECT NumberOfProcessors,NumberOfLogicalProcessors from Win32_ComputerSystem"
strWQLCPUInfo="SELECT Name,DataWidth,description,MaxClockSpeed,NumberofCores,NumberOfLogicalProcessors from Win32_Processor"
strWQLPCInfo="SELECT Domain,DomainRole,SystemType,Manufacturer,Model,TotalPhysicalMemory FROM Win32_ComputerSystem"
' strWQLPCInfo="SELECT Domain,DomainRole,SystemType,Manufacturer FROM Win32_ComputerSystem"
strWQLChassis="SELECT ChassisTypes from Win32_SystemEnclosure"
strWQLID="SELECT IdentifyingNumber,UUID from Win32_ComputerSystemProduct"
strWQLRAM="SELECT * FROM Win32_PhysicalMemory"
strWQLProc="SELECT * FROM Win32_Process"
strWQLBattery="SELECT * FROM BatteryStatus Where Voltage > 0"
' #endregion
' #region MAIN algorithm
'=====================================================================================================
' MAIN
'Algorithm
'1) Check make (vendor)
'2) Check model (in list)
'3) Check RAM >x
'4) Check HDD TYPE (HDD is not RAW)
'5) Check CPU architecture
'6) Check outlook
'7) Check battery
'=====================================================================================================
'Initialise
window.clearInterval(TimerInterval) 'Reset timer to 0
' blnDebug=True
blnDebug=False
bAbortBuild=False 'default to DON'T abort
' bAbortBuild=True
'Build list of approved vendors
Set objApprovedMakesDict = CreateObject("Scripting.Dictionary")
objApprovedMakesDict.comparemode=VBTextCompare
objApprovedMakesDict.add cApprovedOEM,"OK"
objApprovedMakesDict.add LegacyOEM1,"OK"
objApprovedMakesDict.add LegacyOEM2,"OK"
objApprovedMakesDict.add "Lenovo","Testdata"
If blnDebug Then Stop
'1) all machines check make
strHTAVendor=fCheckVendor(strWQLGenericBIOS) 'check vendor in BIOS - if vendor not approved ABORT without proceeding
If bAbortBuild=True Then
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "FATAL ERROR - goodbye cruel world"
iTimer = window.setTimeout("Abort", iAbortTimeout, "VBScript")
Else
StatusBar.InnerText="Vendor: " & strHTAVendor & vbTab & " " & strHTAVendorState
'2) Discover current Model
strHTAModel=fGetModelName(strWQLPCInfo) 'get model name from WMI
strHTAModel=fUniversalCheckData(strHTAModel,"'Discover Model - fGetModelName'") 'validate
Call fGetModels 'get list of all valid models (from text file)
strHTAModel=fCheckModel(strHTAModel)
'2a) Model number (optional)
strHTAProduct=fGetComputerSystemProdIDNumber(strWQLID) 'manufacturer's product ID
strHTAProduct=fUniversalCheckData(strHTAProduct,"'Discover ID - fGetComputerSystemProdIDNumber'")
' StatusBar.InnerText=StatusBar.InnerText & VbCrLf & vbTab & "Product Code: " & vbTab & strHTAProduct
'3) Check installed Memory
strHTARAM=fGetRAM(strWQLRAM) 'find RAM size
strHTARAM=fUniversalCheckData(strHTARAM,"'Detect RAM - fCheckRAM'")
strHTARAM=fCheckRAM(strHTARAM) 'check RAM meets req
If strHTARAMState=cFail Then Exit Function
'4) Disk format IS NTFS
strDisks=fGetDrives(strWQLFSType) 'Get formatting info for all drives
strHTACheckRAW=fUniversalCheckData(strDisks,"'Detect filesystem - fCheckNTFS'") 'Validate data
strHTACheckRAW=fCheckNTFS(strDisks) 'Check FS format is acceptable (not RAW)
If strHTACheckRAW=cFail Then Exit Function
'Generic CPU calls
strHTACPUFullInfo="CPUs:" & fGetCPUInfo(strWQLCPUInfo) & " with CPU cores:" & iCPUCoreCount
strBIOSInfo="BIOS version: " & strBIOSver & ", dated " & strBIOSDate
'5a) CPU Speed check (info from http://www.robvanderwoude.com/wmiexamples.php)
strCPUInfo=WMI(strWQLCPUInfo,strNamespace) 'Get CPU details
strTemp=split(strCPUInfo,"@"): strHTACPUSpeed=strTemp(1)
strHTACPUSpeed=fUniversalCheckData(strHTACPUSpeed,"'Check processor - fCheckCPUSpeed'") 'Validate data
strHTACPUSpeed=fCheckCPUSpeed(strHTACPUSpeed) 'Check CPU clock speed
'5b) cores check
strHTACPUCores=fUniversalCheckData(iCPUCoreCount,"Check core count - fCheckCores") 'Validate data
iCPUCoreCount=fCheckCores(iCPUCoreCount) 'pass or fail?
'5c) CPU address width
strHTAArchitecture=fUniversalCheckData(strHTAArchitecture,"Check core count - fCheckCores") 'Validate data
strHTAArchitecture=fCheckCPUArch(strHTAArchitecture)
'6) Check outlook
strHTAOutlook=fCheckProcess(strWQLProc)
'7) Check Battery
strHTABattery=fCheckBattery(strWQLBattery)
'end checkss
document.body.style.cursor = "default"
'Display hardware values in GUI (in table)
Vendor.innerhtml = strHTAVendor 'Use str...var..STATE if you want Pass/fail text instead
Model.innerhtml = strHTAModel
Product.innerhtml = strHTAProduct
RAM.innerhtml = strHTARAM
CPUspeed.innerhtml = strHTACPUSpeed
CPUInfo.innerhtml = strHTACPUFullInfo
HDDFS.innerhtml = strHTACheckRAW
CapableArchitecture.innerhtml=strHTAArchitecture
BIOSversion.innerhtml = strBIOSver
BIOSDate.innerhtml = strBIOSDate' CPUName.innerhtml = strCPUDesc 'GetCPUName
End If
'======================================================================================
' #endregion
End Function
'generic WMI queries, by field and namespace
Function WMI(strQuery,strNameSpace)
'Aim: generic WMI calls
'return value of BIOS
On Error Resume Next
Dim colItems,objItem
Dim objWMI
Const strService = "winmgmts:{impersonationlevel=impersonate}//" 'binding to WMI
Const strComputer = "." 'this machine
Set objWMI = GetObject(strService & strComputer & strNamespace) 'GLOBAL wmi
Set colItems = objWMI.ExecQuery(strQuery,,lFlags)
For Each objItem In colItems
If Err Then
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "WMI query: " & strQuery & " in " & strNamespace & objItem.Name
Call ErrHandler("WMI error " & strQuery,1)
Else
WMI=objItem.Name 'Return value
End If
Next
End Function
Function fGetModelName(strWQLPCInfo)
'Aim: Get model name from BIOS - WMI field sometimes varies if laptop, so try two
'Return STRING: Model string from BIOS or "UNKNOWN" if null
On Error Resume Next
Dim colPCInfo,objPCItem
Dim strModel
Set colPCInfo = GetObject("winmgmts:").ExecQuery(strWQLPCInfo,"WQL",lFlags)
If Err Then
Call ErrHandler("fGetModelName: Error querying WMI " & strWQLPCInfo,2)
Else
For Each objPCItem In colPCInfo
If Not IsNull(objPCItem.Model) Then
strModel=objPCItem.Model
' iRAM=objPCItem.TotalPhysicalMemory
Else
If (strHTAVendor=cApprovedOEM And IsLaptop = True) Then ' resort to HP specific query for older laptops
'Notebook
strModel=QueryHPBIOS(sNoteModel)
if strModel="" then strModel=QueryHPBIOS(sModel) 'try alt value
Else
strModel=QueryHPBIOS(sModel)
End If
End If
Next
End If
If strModel = "" Then
fGetModelName = "UNKNOWN"
Model.style.visibility="hidden"
Else
fGetModelName=strModel
End If
End Function
'====================================================
'====================================================
Function fGetRAM(strQuery)
'Aim: get RAM installed. NB Win32_ComputerSystem::TotalPhysicalMemory may not be accurate
'Return integer
On Error Resume Next 'equiv to Err.Clear
Dim colItems, item
Dim iTotalMemory
Set colItems = GetObject("winmgmts:").ExecQuery(strQuery,"WQL",lFlags)
If Err Then
Call ErrHandler("fGetRAM: Error querying " & strQuery,2)
Else
iTotalMemory = 0
For Each item In colItems
iTotalMemory = iTotalMemory + CDBL(item.Capacity)/(1024^2)
Next
End If
If iTotalMemory = "" Then
fGetRAM = "RAM UNKNOWN"
RAM.style.visibility="hidden"
Else
fGetRAM=iTotalMemory
End If
End Function
'====================================================
'====================================================
Function fGetCPUInfo(strQuery)
'Aim: query WMI for CPU info - number and number of cores
'Return: function=CPU count, var for the cores: iCPUCoreCount, strHTAArchitecture, strCPUDesc
On Error Resume Next
Dim colItems, objItem
Dim NumberOfProcessors
Set colItems = GetObject("winmgmts:").ExecQuery(strQuery,"WQL",lFlags)
If Err Then
Call ErrHandler("GetCPUInfo: Error querying " & strQuery,2)
Else
For Each objItem In colItems
If Err Then
Else
If Not IsNull(objItem.NumberOfCores) Then
NumberOfProcessors = Trim(objItem.NumberOfCores) 'NumberOfProcessors
End If
If Not IsNull(objItem.NumberOfLogicalProcessors) Then
iCPUCoreCount = Int(Trim(objItem.NumberOfLogicalProcessors))
End If
If Not IsNull(objItem.DataWidth) Then
strHTAArchitecture=Trim(objItem.DataWidth) & "-bit"
End If
If Not IsNull(objItem.description) Then
strCPUDesc = Trim(objItem.description) 'cpu name
End If
End If
Next
If NumberOfProcessors = "" Then
NumberOfProcessors = "UNKNOWN"
End If
fGetCPUInfo = Int(NumberOfProcessors)
' iCPUCoreCount = Int(NumberOfLogicalProcessors)
End If
End Function
'====================================================
'====================================================
Function fGetComputerSystemProdIDNumber(strWQLID)
'Aim: Get UUID from Win32_ComputerSystemProduct
'Return: great big integer
Dim colSys,objSys
Dim strUUID
On Error resume next
Set colSys = GetObject("winmgmts:").ExecQuery(strWQLID,"WQL",lFlags)
If Err then
Call ErrHandler("fGetComputerSystemProdIDNumber: Error querying " & strWQLID,2)
Else
For Each objSys In colSys
If Not IsNull(objSys.IdentifyingNumber) Then
strUUID = Trim(objSys.IdentifyingNumber)
End If
Next
If strUUID = "" Then
fGetComputerSystemProdIDNumber = "UNKNOWN"
Else
fGetComputerSystemProdIDNumber = strUUID
End If
End If
End Function
'=================================================================================
'=================================================================================
Function fGetDrives(strQuery)
Dim colDisks,objHDD
Dim strDriveType, strDiskSize, strDisk
Dim strDiskFSType
Dim iGBUnits
On Error Resume Next
iGBUnits=1073741824
Dim iRAW
iRAW=0
Set colDisks = GetObject("winmgmts:").ExecQuery(strQuery)
For Each objHDD In colDisks
Select Case objHDD.DriveType
Case 1 strDriveType = "Drive could not be determined."
Case 2 strDriveType = "Removable Drive"
Case 3 strDriveType = "Local hard disk."
Case 4 strDriveType = "Network disk."
Case 5 strDriveType = "Compact disk (CD)"
Case 6 strDriveType = "RAM disk."
Case Else strDriveType = "Drive type Problem."
End Select
strDiskFSType = objHDD.FileSystem
'Find C
If objHDD.Name="C:" Then
If isNull(objHDD.FreeSpace) Then
If blnDebug=True then Call ErrHandler("ALERT!! Volume " & objHDD.Name & "is RAW",1) 'Abort/clean
fCheckDrives="ALERT!! Volume " & objHDD.Name & "is RAW"
End If
End If
strDiskSize = Int(objHDD.Size /iGBUnits) & "GB" 'calc size of disk
strDisk = strDisk & VbCrLf & "Vol " & objHDD.Name & " (" & strDriveType & ") size: " & strDiskSize & " (free: " & Int(objHDD.FreeSpace /iGBUnits) & "GB), " & strDiskFSType
fGetDrives=strDisk
Next
If (Err.Number <>0) Then
Call ErrHandler("WMI Property Query Error: [" & Err.Number & "]",2)
fGetDrives = -1
Exit Function
End If
End Function
'=================================================================================
'=================================================================================
Function fUniversalCheckData(varData,strStage) 'template
'Aim: Check value passed...
'is not blank
'is in range x..y
'spelt OK
'is in a list
'format is text, numeric
'return: string: the original value
On Error Resume Next
Dim Err
if blnDebug Then StatusBar.InnerText = StatusBar.InnerText & VbCrLf & "Validating " & strStage & " data..."
If Err Then
Call ErrHandler("WARNING: Error discovering value in " & strStage,2) '1=Quit,2=Warn
strHTAModel="Unknown"
Else
Select Case varData
Case IsEmpty(varData) Or IsNull(varData)
Call ErrHandler("WARNING: Error in "& strStage,2) '1=Quit,2=Warn
fUniversalCheckData="Unknown"
Case IsNumeric(varData)
If varData<0 Then
Call ErrHandler("WARNING: Value negative"& strStage,2) '1=Quit,2=Warn
fUniversalCheckData="Unknown"
End if
' & varData &
Case IsDate(varData)
Case Else
fUniversalCheckData=varData 'Data OK - return value unchanged
End Select
End If
End Function
'=================================================================================
'Checks - follow if true DO, if false warn/abort
'=================================================================================
Function fCheckBattery(strQuery)
'Aim: Find if battery is running
'Return pass/fail
On Error Resume Next 'equiv to Err.Clear
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Dim colItems, item
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
Set colItems = objWMIService.ExecQuery("SELECT * FROM BatteryStatus Where Voltage > 0", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each item In colItems
if objItem.PowerOnline = True Then
strHTABattery=objItem.PowerOnline
strHTABatteryState = cFail
Err.Raise 9010,"fCheckBattery",strHTABattery & " Laptop running on battery. OSD Cannot continue."
Call ErrHandler(ucase(strHTABatteryState) & ": " & Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1)
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "FATAL ERROR - Laptop on Battery. Please plug into an outlet before proceeding."
iTimer = window.setTimeout("Abort", iAbortTimeout, "VBScript")
Else
strHTABatteryState = cPassed
End if
Next
fCheckBattery=strHTABattery
End Function
'====================================================
Function fCheckProcess(strQuery)
'Aim: Find if outlook is running
'Return pass/fail
On Error Resume Next 'equiv to Err.Clear
Dim colItems, item
Set colItems = GetObject("winmgmts:").ExecQuery(strQuery,"WQL",lFlags)
For Each item In colItems
if item.Name = "OUTLOOK.EXE" Then
strHTAOutlook=item.Name
strHTAOutlookState = cFail
Err.Raise 9010,"fCheckOutlook",strHTAOutlook & " running. OSD Cannot continue."
Call ErrHandler(ucase(strHTAOutlookState) & ": " & Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1)
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "FATAL ERROR - Outlook Running, please close outlook before proceeding."
iTimer = window.setTimeout("Abort", iAbortTimeout, "VBScript")
Elseif item.Name = "communicator.exe" Then
strHTAOutlook=item.Name
strHTAOutlookState = cFail
Err.Raise 9010,"fCheckOutlook",strHTAOutlook & " running. OSD Cannot continue."
Call ErrHandler(ucase(strHTAOutlookState) & ": " & Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1)
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "FATAL ERROR - Communicator Running, please close OCS before proceeding."
iTimer = window.setTimeout("Abort", iAbortTimeout, "VBScript")
Else
strHTAOutlookState = cPassed
End if
Next
fCheckProcess=strHTAOutlook
End Function
'====================================================
'1 - Make
Function fCheckVendor(strVendor)
'Aim: Check make is one the OS/build is designed For
'Return: STRINGS for "Make", BIOS version and BIOS date (generic): strHTAVendorState pass or fail
On Error Resume Next
Dim colItems,objItem
Set colItems = GetObject("winmgmts:").ExecQuery(strVendor, "WQL", lFlags)
For Each objItem In colItems
strHTAVendor=objItem.Manufacturer
if objApprovedMakesDict.exists(strHTAVendor) then
strBIOSver=objItem.SMBIOSBIOSVersion
strBIOSDate=Mid( objItem.ReleaseDate, 5, 2 ) & "/" & Mid( objItem.ReleaseDate, 7, 2 ) & "/" & Left( objItem.ReleaseDate, 4 )
strHTAVendorState=cPassed
Else
strHTAVendorState=cFail
Err.Raise 9010,"fCheckVendor",strHTAVendor & " found. The build will not work on this make of hardware"
Call ErrHandler(ucase(strHTAVendorState) & ": " & Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1)
bAbortBuild=True
end if
Next
fCheckVendor=strHTAVendor
End Function
'=================================================================================
'=================================================================================
'2 - Models check
Function fCheckModel(strThisModel)
'Aim Check target machine is in list of models
'Return string
On Error Resume Next
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "Checking model..." & VbCrLf
If objModelsDict.exists(trim(strThisModel)) then ' if current model in objDict then huzzah
strHTAModelState=cPassed
StatusBar.InnerText=StatusBar.InnerText & vbTab & "Model detected: " & vbTab & strHTAModelState
Else
strHTAModelState=cFail
Err.Raise 9010,"fCheckModel",strThisModel & " found. The build will not work on this model of hardware"
Call ErrHandler(ucase(strHTAModelState) & ": " & Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1)
end if
fCheckModel=strHTAModel
End Function
'=================================================================================
'=================================================================================
'3 - RAM
Function fCheckRAM(strRAM)
'Aim: Check installed RAM > x
'Return string digits with units, e.g. 4GB
'use strHTARAM for value
'==================================================================
' Memory Preflight Check (from MDT2012)
'==================================================================
On Error Resume Next
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "Checking RAM..."
If Err.Number <> 0 Then
Call ErrHandler("Error occurred while calculating computer's memory.",2)
End If
fCheckRAM = Int(strRAM/1024) & "GB" 'format in GB
If Int(strRAM) > cMinimumMemoryMB Then
strHTARAMState=cPassed 'Sufficient memory - show whole number in GB"
StatusBar.InnerText=StatusBar.InnerText & vbTab & "RAM installed: " & vbTab & strHTARAMState
Else
strHTARAMState=cFail
Err.Raise 9030 ,"fCheckRAM","Not enough memory in this machine!" & " Required physical memory is: " & cMinimumMemoryMB & " MB."
Call ErrHandler(ucase(strHTARAMState) & ": " & Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1) 'abort build
End If
End Function
'=================================================================================
'=================================================================================
'4 - NTFS disk
Function fCheckNTFS(strDiskFS)
'Aim: Check HDD is NTFS
'Return string
On Error Resume Next
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "Checking file system is not RAW..."
If Instr(1,strDiskFS,cMinFS,VBTextCompare)<>0 Then
fCheckNTFS=cMinFS 'disk format is OK (NTFS)
StatusBar.InnerText=StatusBar.InnerText & vbTab & " File system: " & cPassed
Else
fCheckNTFS=cFail
Err.Raise 9040 ,"fCheckNTFS","WARNING: Disk not correct file-system. Type required is: " & cMinFS & "." & VbCrLf & _
"The deployment will fail unless you reformat the target disk immediately."
Call ErrHandler(Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",2) 'halt build
End If
End Function
'====================================================
'=================================================================================
'5 - CPU checks
'=================================================================================
Function fCheckCPUSpeed(strCPU) 'any HW
'Aim: Check CPU speed
'Return string = number + appropriate units, e.g. 5HGz (strCPU)
On Error Resume Next
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "Checking CPU spec..."
Select Case Right(strCPU,3) 'check units
Case "MHz"
strCPU=Left(strCPU,4)/1000 'reformat to GHz
Case "GHz"
strCPU=strCPU 'unit already OK
Case Else
Call ErrHandler("CPU units are unknown",2)
End Select
'Check clock speed
If Int(Left(trim(strCPU),1))>=iMinCPUSpeed Then
fCheckCPUSpeed=strHTACPUSpeed 'CPU is fine i.e don't change value
StatusBar.InnerText=StatusBar.InnerText & vbTab & "CPU Speed: " & cPassed
Else
fCheckCPUSpeed=cFail 'already in GHz
Err.Raise 9050,"fCheckCPUSpeed","CPU speed pre-requisite failed. Minimum processor clock speed is: " & iMinCPUSpeed
Call ErrHandler(Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1) 'halt build
End If
End Function
'=================================================================================
'=================================================================================
Function fCheckCPUArch(strCPUArch) 'any HW
'Aim: Check CPU width
'Return string
On Error Resume Next
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "Checking CPU bus width..."
'Check clock speed
If Int(Left(trim(strCPUArch),2))>=iMinCPUArch Then
fCheckCPUArch=strHTAArchitecture 'CPU is fine i.e don't change value
StatusBar.InnerText=StatusBar.InnerText & vbTab & "CPU width: " & cPassed
Else
fCheckCPUArch=cFail 'already in GHz
Err.Raise 9052,"fCheckCPUArch","CPU width pre-requisite failed. Minimum processor width required is: " & iMinCPUArch
Call ErrHandler(Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",1) 'abort build
End If
End Function
'=================================================================================
Function fCheckCores(iCores)
'Aim: Check hardware (CPU) has a minimum number of cores
'Return Integer
On Error Resume Next
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & "Checking CPU cores..."
If iCores>=iMinCores Then
fCheckCores=iCores
StatusBar.InnerText=StatusBar.InnerText & vbTab & "Core count: " & vbTab & cPassed
'StatusBar.InnerText=StatusBar.InnerText & vbTab & "CPU cores: " & cPassed
Else
fCheckCores=cFail
Err.Raise 9051,"fCheckCores","WARNING: Not enough cores on the CPU to support the build. Minimum CPU cores is: " & iMinCores
Call ErrHandler(Err.Description & " (Code: " & Err.Number & " - " & Err.Source & ")",2) 'halt build
End If
End Function
'=================================================================================
'=================================================================================
Function fCheckHPCPUSpeed 'HP ONLY
'Aim: Check CPU speed
'return: string
'Check CPU speed
On Error Resume Next
strWQLCPU = "processor speed"
strTemp=QueryHPBIOS(strWQLCPU,"")
Select Case Right(strTemp,3)
Case "MHz"
strTemp=Left(strTemp,4)/1000 'reformat to GHz
Case "GHz"
strTemp 'is OK
Case Else
Call ErrHandler("CPU is unknown",2)
End Select
'Check clock speed
If strTemp>=iMinCPUSpeed Then
fCheckCPUSpeed= strTemp & "GHz"
Else
Err.Raise 9050,,"CPU speed pre-requisite failed"
Call ErrHandler("CPU is too slow",1)
fCheckCPUSpeed=cFail 'already in GHz
End If
End Function
'=================================================================================
'=================================================================================
Function fGetModels
'Aim: Read external text file
'return: dictionary object - models as key, integer as value e.g. Dell Optiplex,12
'On Error Resume Next
Dim objFSO
Dim objFile
Dim strFile
Dim strEntry
Dim n
Dim strfilepath
Dim iLineCount 'count lines to avoid listing first item with ,.
Set objModelsDict = CreateObject("Scripting.Dictionary")
set objFSO=CreateObject("Scripting.FileSystemObject")
Const ForReading=1
strfilepath = Left(window.location.pathname,InStrRev(window.location.pathname,"\"))
strFile=strfilepath & "Models.txt"
set objFile=objFSO.OpenTextFile(strFile,ForReading)
iLineCount=0
'read in each line of data until you reach the end of the file
do While objFile.AtEndOfStream<>True
strEntry=objFile.ReadLine
'you can now do what ever you want with the line as referenced with the strEntry variable such as
'echoing it back (e.g. wscript.Echo strEntry) or passing it as a variable to a function of subroutine (e.g. MyFunction strEntry)
objModelsDict.comparemode=VBTextCompare
objModelsDict.Add strEntry,iLineCount
iLineCount=iLineCount+1
If blnDebug then
If iLineCount=1 Then
StatusBar.InnerText=trim(strEntry)
Else
StatusBar.InnerText=StatusBar.InnerText & ", " & trim(strEntry) 'list models
End If
End If
Loop
objFile.Close
End Function
'=================================================================================
'=================================================================================
'====================================================
Function ErrHandler(strErrorMsg,iErrMode)
'Aim: to handle error states
' 1 = Abort
' 2 = Warn
'Return 'Appropriate text message explaining the error
'====================================================
Const msgTitle="SCCM Deployment Preflight Checklist"
'On Error Resume Next '< don't use that as we want to KEEP the error properties
'Abort=1
If iErrMode=1 Then
StatusBar.InnerText=strErrorMsg 'overwrite status with Error message
' StatusBar.InnerText=StatusBar.InnerText & VbCrLf & " " & strHTAOutlook & " " & strHTAVendor & " " & strHTAVendorState & _
' VbCrLf & " " & strHTAModel & strHTAModelState & _
' VbCrLf & " " & strHTARAM & strHTARAMState & _
' VbCrLf & " " & strHTAHDD & strHTAHDDState
iTimer = window.setTimeout("Abort", iAbortTimeout, "VBScript") 'Abort (close) after n seconds
'MsgBox strErrorMsg,vbExclamation,msgTitle
'ErrBar.class=""
ElseIf iErrMode=2 Then
'Warning
StatusBar.InnerText=StatusBar.InnerText & VbCrLf & strErrorMsg & " " '& "(" & Err.Description & " :" & Err.Number & ")"',vbExclamation,msgTitle
Err.Clear
End If
End Function
'====================================================
Sub Abort
'Aim: Quit gracefully
window.close()
End Sub
</script>
<!-- #region BODY -->
<body>
<br />
<div>
<span style="version"> <span id="VersionSpan"></span></div>
<div style="text-align: center;">
<H1 style="font-family: Arial, Helvetica, sans-serif; font-size: large; text-align: center; color: #000000; text-transform: capitalize">System information</H1>
<span>
<table border="1" cellspacing="0" cellpadding="0" style="width: 912px"
id="SysInfoTable">
<tr class="h1">
<td align="right" class="Header1" style="width: 76px; height: 18px">
</td>
<td align="right" class="Header1" style="height: 18px"><em id="VendorCaption">Vendor</em></td>
<td align="left" class="style2" style="height: 18px"><span id="Vendor"></span></td>
<td align="right" class="Header2" style="height: 18px"><em id="ModelCaption">Model</em></td>
<td align="center" class="style4" style="width: 400px; height: 18px"><span id="Model"></span></td>
</tr>
<tr>
<td align="right" class="Header1" style="width: 76px">
</td>
<td align="right" class="Header1"><em id="ProductCaption">Product ID</em></td>
<td align="left" class="style2"><span id="Product"></span></td>
<td align="right" class="Header2"><em id="RAMCaption">Memory(in MB)</em></td>
<td align="left" class="style4" style="width: 400px"><span id="RAM"></span></td>
</tr>`
<tr>
<td align="right" class="Header1" style="width: 76px">
</td>
<td align="right" class="Header1"><em id="CPUCaption">CPU speed (in GHz)</em></td>
<td align="left" class="style2"><span id="CPUspeed"></span></td>
<td align="right" class="Header2"><em id="CPUInfoCaption">No: CPU\Cores</em></td>
<td align="left" class="style4" style="width: 400px"><span id="CPUInfo"></span></td>
</tr>
<tr>
<td align="right" class="Header1" style="width: 76px">
</td>
<td align="right" class="Header1"><em id="DiskFSCaption">Filesystem info</em></td>
<td align="left" class="style2"><span id="HDDFS"></span></td>
<td align="right" class="Header2"><em id="CapableArchCaption">Architecture</em></td>
<td align="left" class="style4" style="width: 400px"><span id="CapableArchitecture"></span></td>
</tr>
<tr>
<td align="right" class="Header1" style="width: 76px">
</td>
<td align="right" class="Header1"><em id="BIOSVerCaption">BIOS version</em></td>
<td align="left" class="style2" ><span id="BIOSVERSION"></span></td>
<td align="right" class="Header2"><em id="BIOSDateCaption">BIOS Date</em></td>
<td align="left" class="style4" style="width: 400px"><span id="BIOSDate"></span></td>
</tr>
</table>
</span>
</div>
<div class="StatusBar">
<br />
<Span id="StatusBar">Loading...please wait.</Span>
</div> <br><br>
<div align="center">
<input type="button" name="btnStop" id="btnStop" value="Continue" onclick="Abort">
<input type="Button" value="Re-Scan Machine" name="button1" onClick="Window_Onload" class="button">
</div>
</body><!-- #endregion -->
</html> -
MDT 2013: Wizard Pages by Task Sequence
Hi,
I believe what I am trying to do is not possible from previous readings on this forum, BUT then I see something in my MDT 2013 OSD wizard that seems to indicate there might be a way to get it done. So here goes.
For my own demos, I am trying to develop a deployment share that is much like Johan Arwidmark's hydration kit. Some machines, like a domain controller or a SQL cluster are all well-defined: computer names, IP addresses, etc. are fixed and can be set
in customsettings.ini or in the Task Sequence with variables. However, I would also like the ability to have to deploy a "generic" machine where I can select roles, applications, etc.
This would require having different wizard pages shown for different task sequences. From what I've read, this may not be possible without developing a custom wizard (and that might be too much effort). However, I currently have two task sequences and depending
on which one I select, I see a different number of steps to complete? See screenshots. I don't know what I have currently configured that makes it like that.
(when I select "Domain Controller 01" task sequence) (Task sequence ID "DC01")
(when I select the "generic" task sequence)
Below is my customsettings.ini [the only rules file I have].
[Settings]
Priority=TaskSequence,Default
[Default]
_SMSTSORGNAME=Demo Deployment
OSInstall=Y
SkipCapture=YES
SkipAdminPassword=YES
AdminPassword=P@ssw0rd!
SkipProductKey=YES
SkipComputerBackup=YES
SkipBitLocker=YES
EventService=http://192.168.232.1:9800
SkipUserData=YES
SkipTaskSequence=NO
SkipTimeZone=YES
SkipBitLocker=YES
SkipSummary=YES
SkipFinalSummary=NO
FinishAction=SHUTDOWN
SkipLocaleSelection=YES
HideShell=YES
[DC01]
_SMSTSORGNAME=DC01 Deployment
SkipComputerName=YES
OSDComputerName=DC01
SkipDomainMembership=YES
JoinWorkgroup=DEMO
SkipRoles=YES
I would expect the settings for task sequence "DC01" to be applied after I select that task sequence in the wizard. That doesn't seem to work. The first task in the sequence is a "Gather" task that gathers local data and processes customsettings.ini.
I understand I can't override most settings from [Default] because they would have already been processed but as you can see, that's not what I am actually trying.
I am not opposed to having multiple rules files if that would work. However, it seems like that doesn't make much difference when it comes to actually seeing different wizard steps active. I've tried adding a second customsettings_dc01.ini file and having
a Gather step that specifically references that file in the "Initialize" group.
I've considered some alternatives to making it work this way, such as having multiple deployment shares and "linking" them (although I haven't done this before) so I wouldn't have to copy all the applications.
I would also set the computer name and all in the task sequence using variables, but that still doesn't address the problem.
Any insight is appreciated,
SA.SpeedBird186 - There are several assumptions going on here.
1. by default MDT processes the CS.ini file *before* the wizard, and *after* the Task sequence has started. If you want CS.ini file to be processed just *after* you select your TS in the wizard, use Johan's trick above.
2. There are about 20 different wizard pages, and they don't appear in *all* scenarios. the wizard framework will attempt to do an intelligent job of filtering out pages that are not relevant to the scenario at hand. For example, in the graphic above, you
can see that the OS roles and Features page will appear/disappear. This can happen for example if the task sequence you selected earlier does or does *not* have a "OS Roles and Featrues" step in the Task sequence.
3. For me, the easiest way to process roles would be to create some new "Applications" and to put them in a folder.
Keith Garner - keithga.wordpress.com -
Image not displaying in the Task Sequence Wizard. SCCM2012
This is my question, so I will post the link here.
http://community.spiceworks.com/topic/925727-image-not-displaying-in-the-task-sequence-wizard-sccm2012
Bryan
I captured an image from a PC that I am preparing to be deployed with Office 365. Once I captured
the image, I went to the software library to add the operating system image. That seemed to go on without any issue, but when I look at the summary, I see the big yellow globe saying "in progress" it has not changed since yesterday afternoon.
I then created the task sequence for this image
to be deployed under Software Library, Task Sequences. When I selected the references tab, everything seemed to be in order with the exception of the "operating system image" under type. It was/is showing 0.0% Compliance.So, the problem described in the other forum post does not match the title of this thread. Are you trying to address two different things? These are unrelated btw.
For the issue in the other thread, you'll have to troubleshoot your content distribution to the selected DP. The distmgr.log and pkgxfermgr.log (assuming you chose to distribute the image to a DP directly attached to your primary site) are the places to
start and will show you exactly what's going on.
As for the title of this thread, we'll need a lot more info to help you there.
Finally, I would suggest you copy your questions from other sources into the thread -- this will help other folks in the future that may stumble upon this thread and will prevent any confusion.
Jason | http://blog.configmgrftw.com | @jasonsandys -
Hey guys, I have a fairly odd situation here. I have all OSD Task Sequence advertisements set to "PXE and Boot Media (hidden)" and all are optional
(not mandatory). I use a powershell form via prestart command to give the user a choice which limits what task sequences they choose. When everything is working, this process works. Unknown desktop-class systems see desktop task sequences,
and server-class systems see server task sequences.
Here's where it's different when I use different boot methods:
Boot Media
"Welcome to the Task Sequence Wizard" is presented. User hits or clicks Enter.
Powershell form is presented; user picks their task sequence
Confirmation screen is presented with the task sequence they selected (this is an OSD screen the same size as the "Welcome to the Task Sequence Wizard"
screen.
Dependency check screen is shown with a progress bar. If a package is missing from a DP, it will display an error here with the PackageID. This
looks the same as "Regular" OSD with standard non-hidden advertisements.
PXE Boot
"Welcome to the Task Sequence Wizard" is never displayed.
Powershell form is the first screen they see. They select it and it continues.
No confirmation screen is presented if the system is known; if it is an unknown system, a small dialog says there is a
*mandatory* task sequence about to be run and it will run in 180 seconds. Users can hit enter.
No dependency check screen is shown; and if a package was missing, instead of presenting an error, it simply reboots. However, if everything is there,
the process starts successfully.
While I have no problems with the first window never being displayed, not displaying the error dialog and simply rebooting is what is bothersome to me.
99% of our builds are from PXE boot.
Again, these task sequences are all 100% optional, NOT mandatory, and I've double checked this multiple times. Can anyone explain why we get different
behavior between boot media and PXE boot? Any way of getting PXE boot to "mimic" the Boot media behavior?
I followed the guide here:
http://www.mydreampage.net/2012/09/21/how-can-i-deploy-a-hidden-task-sequence-in-configuration-manager-2012-sp1/
If you see the image here:
http://www.windows-noob.com/forums/uploads/monthly_09_2012/post-1-0-29840100-1348236179.png
You'll see the "Retrieving policy for this computer..." dialog box - I never get that with PXE - just Boot Media.
Note that I am running 2012 R2, not 2012 SP1 - but I never got a chance to test this process with SP1.
Upon further experimentation, the "hidden" task sequence has nothing to do with this. If I change it to a normal, non-hidden advertisement, as
long as the "prestart" command in the boot image is used, we don't get those missing dialog boxes at all, with PXE.Are both boot images the same for PXE and the boot media? Same package ID and all?
Boot media for us always shows the task sequence wizard first, while PXE always displays the pre-start command first.
Daniel Ratliff | http://www.PotentEngineer.com -
SCCM 2012 MDT 2012 UDI Require domain credentials to run task sequence
We are in the process of moving to SCCM 2012 integrated with MDT 2012 for OSD from using MDT 2012 by itself. We're trying out UDI task sequences and have noticed a pretty gaping hole in functionality vs MDT 2012 by itself: password protecting a task sequence.
In MDT 2012 there was a built-in feature that required domain credentials to run a task sequence. If one exists using SCCM/MDT 2012, I haven't been able to find it. I've only found stuff like this http://www.windows-noob.com/forums/index.php?/topic/2336-password-protect-a-task-sequence/ which
would allow you to set a password, but not authenticate against AD. So, I'm wondering if there are any options to protecting a task sequence with domain authentication?
My understanding is that the Refresh and Replace StageGroup only run when you kick off a UDI task sequence in Windows. That means I have to make a task sequence available to the Configuration Manager Client in order for a tech to run a Refresh/Replace. And,
that in turn means that the UDI task sequence will be visible to all users since it needs to be available to their computer. Or, am I completely missing how UDI OSD should flow? If so, then I hope someone can correct me.
I'd appreciate any help or advice you can give. Thanks.Hi,
I am sorry to say that you are correct in your conclusions. There is no builtin way in ConfigMgr/MDT/UDI to require a domain username/password to run a task sequence, your option from Windows-noob.com is one way of solving it.
Regards,
jörgen
-- My System Center blog ccmexec.com -- Twitter
@ccmexec
Thanks for the info. What about workflow? How do you usually handle UDI in Replace and Refresh scenarios? Do you deploy the task sequence to collections that users can access? -
WINPE / Task Sequence Wizard
I am trying to figure out a way to preconfigure some of the task sequence wizard network settings. I would like to be able to populate most of the network settings except the IP address and default gateway, along with the proxy server and proxy server
exceptions. I tried using netsh but the winhttp is not part of the winpe image.
Any help would be great.
EricYou have to do this with prestart function of the boot image and a script. Basically you have to do a script, here's a .vbs example:
Dim oTSEnv
Set oTSEnv = CreateObject("Microsoft.SMS.TSEnvironment")
oTSEnv("OSDAdapter0SubnetMask") = "255.255.255.0"
oTSEnv("OSDAdapter0Gateways") = "192.168.1.1"
oTSEnv("OSDAdapter0DNSDomain") = "domain.com"
oTSEnv("OSDAdapter0DNSServerList") = "192.168.1.100"
Save that to a .vbs -file, name as you please. Configure the boot image you're using to use the script as a source and for the command add: cscript yourscript.vbs
I'm not 100% does the method work, but I would assume it will. Don't know though are the values updated to the GUI (the picture you posted), but you can check this with hitting F8 (assuming you have the cmd support enabled on your boot image) and entering
ipconfig -all ...if the values show up there, they are setted and should work just like they are when typing them in the configuration window you posted. -
I am trying to get Office 2010 to install using a UDI task sequence, and it IS installing, but it has a yellow exclamation point next to it at the summary screen after the task sequence completes, as does another app I am trying to install.
The apps that use an .MSI are fine, and get the green check, but the two apps that use .exe for their installers get the yellow warning sign. I assume this has to do with exit codes or detection rules, but I am very new to SCCM (using 2012 and MDT
2012 Update 1), so I need some help.
Thank you!
EDIT: This probably has to do with the fact that SuccessOrFailureCode being blank. I have been pouring over .vbs scripts and logs, but they all seem to indicate that my application installs just fine, with an exit code of 0. Where does this screen
get the SuccessOrFailureCode?
Like
This
Quote
MultiQuote
EditI have some updated info on this problem.
I am trying to install Symantec Endpoint Protection with a custom wrapped .EXE file, and I have created detection rules for the install.
According to AppEnforce.log, SEP is installing and returning an Exit code of '1', and that is being handled with my custom return code handling, which I've defined as a 'success'. However, the deployment summary is still showing a yellow exclamation point
next to the SEP install, and the SuccessOrFailureCode is blank.
Why isn't the SuccessOrFailureCode equal to '1'? Where is the disconnect between the AppEnforce.log and the deployment summary.
Maybe you are looking for
-
Using AEBS with d-Link 655 (or "how do you set up a bridge?")
Please help - I am at the end of my rope and am now treading into uncharted territory. Basically I want to see if I can have my MacBook working (wirelessly) through the AEBS wireless router, and our Windows PC working (wirelessly) through a d-Link DI
-
Trouble connecting iphone 5s to macbook pro via bluetooth
My MBP (OS 10.10) and iPhone 5S (iOS 8.0.2) (both late 2013) do not connect via bluetooth. I want to use Handoff and file transfer between them, which is why I am trying to connect them. Steps taken: 1) I pair the devices here: 2) My phone says that
-
Need to improve performance for bex queries
Dear Experts, Here we have bex queries buit on BW infoset, further infoset is buit on 2 dsos and 4 infoobjects. we have built secondary indices to the two dso assuming will improve performance, but still query execution time is very long. Could you s
-
Dears I created a return delivery from quality notification and material was taken from block stock(stock type is S) and delivery created but in MD04 it consume from stock for example i have a qty 100 pcs in unrestricted and i created a return delive
-
OA Extension for opportunity create page - Multi Entity Extension
Hello, i'm trying to achieve a multi Entity Extension. We are storing additional attributes in a custom table for opportunities. i'm trying to extend the existing Opportunity Create Page to create an other record in custom table. Here is what i've do