Exemple #1
0
            /// <summary>
            /// Run the test.
            /// </summary>
            public void RunTest()
            {
                Int32ColumnValue columnValue = new Int32ColumnValue();

                columnValue.Value = 0;
                Assert.AreEqual(0, columnValue.ValueAsObject);

                Thread[] threads = new Thread[Environment.ProcessorCount * 2];
                for (int i = 0; i < threads.Length; ++i)
                {
                    threads[i] = new Thread(this.ThreadProc);
                    threads[i].Start(new Random(i));
                    this.activeThreads++;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                Stopwatch stopwatch = Stopwatch.StartNew();

                this.startEvent.Set();
                this.stopEvent.WaitOne();
                stopwatch.Stop();

                foreach (Thread t in threads)
                {
                    t.Join();
                }

                Console.WriteLine("Performed {0:N0} operations on {1} threads in {2}", N, threads.Length, stopwatch.Elapsed);
            }
Exemple #2
0
        private static LinkTableRow[] EnumerateLinkTable(JetDb db)
        {
            Stopwatch stopwatch = null;

            if (ShowDebugOutput)
            {
                ConsoleEx.WriteDebug($"Called: {nameof(NtdsAudit)}::{nameof(EnumerateLinkTable)}");
                stopwatch = new Stopwatch();
                stopwatch.Start();
            }

            using (var table = db.OpenJetDbTable(LINKTABLE))
            {
                // Get a dictionary mapping column names to column ids
                var columnDictionary = table.GetColumnDictionary();

                var linktable        = new List <LinkTableRow>();
                var deletedLinkCount = 0;

                // Loop over the table
                table.MoveBeforeFirst();
                while (table.TryMoveNext())
                {
                    var linkDelTimeColumn = new DateTimeColumnValue {
                        Columnid = columnDictionary["link_deltime"]
                    };
                    var linkDntColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["link_DNT"]
                    };
                    var backlinkDnt = new Int32ColumnValue {
                        Columnid = columnDictionary["backlink_DNT"]
                    };
                    table.RetrieveColumns(linkDelTimeColumn, linkDntColumn, backlinkDnt);

                    // Ignore deleted links
                    if (linkDelTimeColumn.Error == JET_wrn.Success)
                    {
                        deletedLinkCount++;
                        continue;
                    }

                    linktable.Add(new LinkTableRow
                    {
                        LinkDnt     = linkDntColumn.Value.Value,
                        BacklinkDnt = backlinkDnt.Value.Value,
                    });
                }

                if (ShowDebugOutput)
                {
                    ConsoleEx.WriteDebug($"  Ignored {deletedLinkCount} deleted backlinks");
                    ConsoleEx.WriteDebug($"  Found {linktable.Count} backlinks");

                    stopwatch.Stop();
                    ConsoleEx.WriteDebug($"  Completed in {stopwatch.Elapsed}");
                }

                return(linktable.ToArray());
            }
        }
Exemple #3
0
        public BlockTxNode ReadNode()
        {
            var blockIndexColumn = new Int32ColumnValue {
                Columnid = cursor.blockIndexColumnId
            };
            var txIndexColumn = new Int32ColumnValue {
                Columnid = cursor.txIndexColumnId
            };
            var depthColumn = new Int32ColumnValue {
                Columnid = cursor.blockDepthColumnId
            };
            var txHashColumn = new BytesColumnValue {
                Columnid = cursor.blockTxHashColumnId
            };

            Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, blockIndexColumn, txIndexColumn, depthColumn, txHashColumn);

            if (this.blockIndex != blockIndexColumn.Value.Value)
            {
                throw new InvalidOperationException();
            }

            var txIndex = txIndexColumn.Value.Value;
            var depth   = depthColumn.Value.Value;
            var txHash  = DbEncoder.DecodeUInt256(txHashColumn.Value);

            var pruned = depth >= 0;

            depth = Math.Max(0, depth);

            return(new BlockTxNode(txIndex, depth, txHash, pruned, encodedTx: null));
        }
Exemple #4
0
            /// <summary>
            /// Run the test.
            /// </summary>
            public void RunTest()
            {
#if !MANAGEDESENT_ON_WSA // The threading model in Windows Store Apps has changed.
                Int32ColumnValue columnValue = new Int32ColumnValue();
                columnValue.Value = 0;
                Assert.AreEqual(0, columnValue.ValueAsObject);

                Thread[] threads = new Thread[Environment.ProcessorCount * 2];
                for (int i = 0; i < threads.Length; ++i)
                {
                    threads[i] = new Thread(this.ThreadProc);
                    threads[i].Start(new Random(i));
                    this.activeThreads++;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();

                Stopwatch stopwatch = Stopwatch.StartNew();
                this.startEvent.Set();
                this.stopEvent.WaitOne();
                stopwatch.Stop();

                foreach (Thread t in threads)
                {
                    t.Join();
                }

                EseInteropTestHelper.ConsoleWriteLine("Performed {0:N0} operations on {1} threads in {2}", N, threads.Length, stopwatch.Elapsed);
#endif // !MANAGEDESENT_ON_WSA
            }
Exemple #5
0
        public void TestInt32ColumnValueToString()
        {
            var instance = new Int32ColumnValue {
                Value = 5
            };

            Assert.AreEqual("5", instance.ToString());
        }
Exemple #6
0
        public void TestInt32Length()
        {
            var value = new Int32ColumnValue();

            foreach (int i in new[] { int.MinValue, int.MinValue + 1, -1, 0, 1, Any.Int32, 65521, int.MaxValue - 1, int.MaxValue })
            {
                TestLengthForStruct(value, i, 4);
            }
        }
Exemple #7
0
        public void TestInt32ValueAsObject()
        {
            var value = new Int32ColumnValue();

            foreach (int i in new[] { int.MinValue, int.MinValue + 1, -1, 0, 1, Any.Int32, 65521, int.MaxValue - 1, int.MaxValue })
            {
                TestValueAsObjectForStruct(value, i);
            }
        }
Exemple #8
0
        private static IReadOnlyDictionary <string, string> EnumerateDatatableTableLdapDisplayNames(JetDb db, MSysObjectsRow[] mSysObjects)
        {
            Stopwatch stopwatch = null;

            if (ShowDebugOutput)
            {
                ConsoleEx.WriteDebug($"Called: {nameof(NtdsAudit)}::{nameof(EnumerateDatatableTableLdapDisplayNames)}");
                stopwatch = new Stopwatch();
                stopwatch.Start();
            }

            var ldapDisplayNameToColumnNameDictionary = new Dictionary <string, string>();
            var unmatchedCount = 0;

            using (var table = db.OpenJetDbTable(DATATABLE))
            {
                // Get a dictionary mapping column names to column ids
                var columnDictionary = table.GetColumnDictionary();

                // Loop over the table
                table.MoveBeforeFirst();
                while (table.TryMoveNext())
                {
                    var ldapDisplayNameColumn = new StringColumnValue {
                        Columnid = columnDictionary["ATTm131532"]
                    };
                    var attributeIdColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["ATTc131102"]
                    };
                    table.RetrieveColumns(attributeIdColumn, ldapDisplayNameColumn);

                    if (attributeIdColumn.Value != null)
                    {
                        if (Array.Find(mSysObjects, x => x.AttributeId == attributeIdColumn.Value) == null)
                        {
                            unmatchedCount++;
                        }
                        else
                        {
                            ldapDisplayNameToColumnNameDictionary.Add(ldapDisplayNameColumn.Value, mSysObjects.First(x => x.AttributeId == attributeIdColumn.Value).ColumnName);
                        }
                    }
                }
            }

            if (ShowDebugOutput)
            {
                ConsoleEx.WriteDebug($"  Failed to match {unmatchedCount} LDAP display names to datatable column names");
                ConsoleEx.WriteDebug($"  Matched {ldapDisplayNameToColumnNameDictionary.Count} LDAP display names to datatable column names");

                stopwatch.Stop();
                ConsoleEx.WriteDebug($"  Completed in {stopwatch.Elapsed}");
            }

            return(new ReadOnlyDictionary <string, string>(ldapDisplayNameToColumnNameDictionary));
        }
Exemple #9
0
        /// <summary>
        /// Retrieve columns using the basic RetrieveColumns API.
        /// </summary>
        private void RetrieveWithRetrieveColumns()
        {
            var boolColumn = new BoolColumnValue {
                Columnid = this.columnidDict["boolean"]
            };
            var int32Column = new Int32ColumnValue {
                Columnid = this.columnidDict["int32"]
            };
            var int64Column = new Int64ColumnValue {
                Columnid = this.columnidDict["int64"]
            };
            var guidColumn = new GuidColumnValue {
                Columnid = this.columnidDict["guid"]
            };
            var stringColumn = new StringColumnValue {
                Columnid = this.columnidDict["unicode"]
            };

            var retrievecolumns = new ColumnValue[]
            {
                boolColumn,
                int32Column,
                int64Column,
                guidColumn,
                stringColumn,
            };

            for (int i = 0; i < NumRetrieves; ++i)
            {
                Api.JetBeginTransaction(this.session);

                Api.RetrieveColumns(this.session, this.tableid, retrievecolumns);

                bool   actualBool   = (bool)boolColumn.Value;
                int    actualInt32  = (int)int32Column.Value;
                long   actualInt64  = (long)int64Column.Value;
                Guid   actualGuid   = (Guid)guidColumn.Value;
                string actualString = stringColumn.Value;

                Assert.AreEqual(this.expectedBool, actualBool);
                Assert.AreEqual(this.expectedInt32, actualInt32);
                Assert.AreEqual(this.expectedInt64, actualInt64);
                Assert.AreEqual(this.expectedGuid, actualGuid);
                Assert.AreEqual(this.expectedString, actualString);

                Api.JetCommitTransaction(this.session, CommitTransactionGrbit.None);
            }
        }
        private IEnumerable <UnspentTx> ReadUnspentTransactionsInner()
        {
            using (SetSessionContext())
            {
                Api.JetSetCurrentIndex(this.jetSession, this.unspentTxTableId, "IX_TxHash");

                if (Api.TryMoveFirst(this.jetSession, this.unspentTxTableId))
                {
                    do
                    {
                        var txHashColumn = new BytesColumnValue {
                            Columnid = this.txHashColumnId
                        };
                        var blockIndexColumn = new Int32ColumnValue {
                            Columnid = this.blockIndexColumnId
                        };
                        var txIndexColumn = new Int32ColumnValue {
                            Columnid = this.txIndexColumnId
                        };
                        var txVersionColumn = new UInt32ColumnValue {
                            Columnid = this.txVersionColumnId
                        };
                        var isCoinbaseColumn = new BoolColumnValue {
                            Columnid = this.isCoinbaseColumnId
                        };
                        var outputStatesColumn = new BytesColumnValue {
                            Columnid = this.outputStatesColumnId
                        };
                        var txOutputBytesColumn = new BytesColumnValue {
                            Columnid = this.txOutputBytesColumnId
                        };
                        Api.RetrieveColumns(this.jetSession, this.unspentTxTableId, txHashColumn, blockIndexColumn, txIndexColumn, txVersionColumn, isCoinbaseColumn, outputStatesColumn, txOutputBytesColumn);

                        var txHash       = DbEncoder.DecodeUInt256(txHashColumn.Value);
                        var blockIndex   = blockIndexColumn.Value.Value;
                        var txIndex      = txIndexColumn.Value.Value;
                        var txVersion    = txVersionColumn.Value.Value;
                        var isCoinbase   = isCoinbaseColumn.Value.Value;
                        var outputStates = DataDecoder.DecodeOutputStates(outputStatesColumn.Value);

                        yield return(new UnspentTx(txHash, blockIndex, txIndex, txVersion, isCoinbase, outputStates));
                    }while (Api.TryMoveNext(this.jetSession, this.unspentTxTableId));
                }
            }
        }
        public bool TryGetUnspentTx(UInt256 txHash, out UnspentTx unspentTx)
        {
            CheckTransaction();

            using (SetSessionContext())
            {
                Api.JetSetCurrentIndex(this.jetSession, this.unspentTxTableId, "IX_TxHash");
                Api.MakeKey(this.jetSession, this.unspentTxTableId, DbEncoder.EncodeUInt256(txHash), MakeKeyGrbit.NewKey);
                if (Api.TrySeek(this.jetSession, this.unspentTxTableId, SeekGrbit.SeekEQ))
                {
                    var blockIndexColumn = new Int32ColumnValue {
                        Columnid = this.blockIndexColumnId
                    };
                    var txIndexColumn = new Int32ColumnValue {
                        Columnid = this.txIndexColumnId
                    };
                    var txVersionColumn = new UInt32ColumnValue {
                        Columnid = this.txVersionColumnId
                    };
                    var isCoinbaseColumn = new BoolColumnValue {
                        Columnid = this.isCoinbaseColumnId
                    };
                    var outputStatesColumn = new BytesColumnValue {
                        Columnid = this.outputStatesColumnId
                    };
                    var txOutputBytesColumn = new BytesColumnValue {
                        Columnid = this.txOutputBytesColumnId
                    };
                    Api.RetrieveColumns(this.jetSession, this.unspentTxTableId, blockIndexColumn, txIndexColumn, txVersionColumn, isCoinbaseColumn, outputStatesColumn, txOutputBytesColumn);

                    var blockIndex   = blockIndexColumn.Value.Value;
                    var txIndex      = txIndexColumn.Value.Value;
                    var txVersion    = txVersionColumn.Value.Value;
                    var isCoinbase   = isCoinbaseColumn.Value.Value;
                    var outputStates = DataDecoder.DecodeOutputStates(outputStatesColumn.Value);

                    unspentTx = new UnspentTx(txHash, blockIndex, txIndex, txVersion, isCoinbase, outputStates);
                    return(true);
                }

                unspentTx = default(UnspentTx);
                return(false);
            }
        }
        private void InitColumns()
        {
            _colIdShapeLabel     = Api.GetTableColumnid(Sesid, Table, colNameShapeLabel);
            _colIdIfcShapeLabel  = Api.GetTableColumnid(Sesid, Table, colNameIfcShapeLabel);
            _colIdGeometryHash   = Api.GetTableColumnid(Sesid, Table, colNameGeometryHash);
            _colIdCost           = Api.GetTableColumnid(Sesid, Table, colNameCost);
            _colIdReferenceCount = Api.GetTableColumnid(Sesid, Table, colNameReferenceCount);
            _colIdLOD            = Api.GetTableColumnid(Sesid, Table, colNameLOD);
            _colIdFormat         = Api.GetTableColumnid(Sesid, Table, colNameFormat);
            _colIdBoundingBox    = Api.GetTableColumnid(Sesid, Table, colNameBoundingBox);
            _colIdShapeData      = Api.GetTableColumnid(Sesid, Table, colNameShapeData);

            _colValShapeLabel = new Int32ColumnValue {
                Columnid = _colIdShapeLabel
            };
            _colValIfcShapeLabel = new Int32ColumnValue {
                Columnid = _colIdIfcShapeLabel
            };
            _colValGeometryHash = new Int32ColumnValue {
                Columnid = _colIdGeometryHash
            };
            _colValCost = new Int32ColumnValue {
                Columnid = _colIdCost
            };
            _colValReferenceCount = new Int32ColumnValue {
                Columnid = _colIdReferenceCount
            };
            _colValLOD = new ByteColumnValue {
                Columnid = _colIdLOD
            };
            _colValFormat = new ByteColumnValue {
                Columnid = _colIdFormat
            };
            _colValBoundingBox = new BytesColumnValue {
                Columnid = _colIdBoundingBox
            };
            _colValShapeData = new BytesColumnValue {
                Columnid = _colIdShapeData
            };


            _colValues = new ColumnValue[] { _colValIfcShapeLabel, _colValGeometryHash, _colValCost, _colValReferenceCount, _colValLOD, _colValFormat, _colValBoundingBox, _colValShapeData };
        }
        private void InitColumns()
        {
            _colIdInstanceLabel         = Api.GetTableColumnid(Sesid, Table, colNameInstanceLabel);
            _colIdIfcTypeId             = Api.GetTableColumnid(Sesid, Table, colNameIfcTypeId);
            _colIdIfcProductLabel       = Api.GetTableColumnid(Sesid, Table, colNameIfcProductLabel);
            _colIdStyleLabel            = Api.GetTableColumnid(Sesid, Table, colNameStyleLabel);
            _colIdShapeLabel            = Api.GetTableColumnid(Sesid, Table, colNameShapeLabel);
            _colIdRepresentationContext = Api.GetTableColumnid(Sesid, Table, colNameRepresentationContext);
            _colIdRepType        = Api.GetTableColumnid(Sesid, Table, colNameRepType);
            _colIdTransformation = Api.GetTableColumnid(Sesid, Table, colNameTransformation);
            _colIdBoundingBox    = Api.GetTableColumnid(Sesid, Table, colNameBoundingBox);

            _colValInstanceLabel = new Int32ColumnValue {
                Columnid = _colIdInstanceLabel
            };
            _colValIfcTypeId = new Int16ColumnValue {
                Columnid = _colIdIfcTypeId
            };
            _colValIfcProductLabel = new Int32ColumnValue {
                Columnid = _colIdIfcProductLabel
            };
            _colValStyleLabel = new Int32ColumnValue {
                Columnid = _colIdStyleLabel
            };
            _colValShapeLabel = new Int32ColumnValue {
                Columnid = _colIdShapeLabel
            };
            _colValRepresentationContext = new Int32ColumnValue {
                Columnid = _colIdRepresentationContext
            };
            _colValRepType = new ByteColumnValue {
                Columnid = _colIdRepType
            };
            _colValTransformation = new BytesColumnValue {
                Columnid = _colIdTransformation
            };
            _colValBoundingBox = new BytesColumnValue {
                Columnid = _colIdBoundingBox
            };


            _colValues = new ColumnValue[] { _colValIfcTypeId, _colValIfcProductLabel, _colValStyleLabel, _colValShapeLabel, _colValRepresentationContext, _colValRepType, _colValTransformation, _colValBoundingBox, };
        }
Exemple #14
0
            /// <summary>
            /// Thread proc. This boxes random values.
            /// </summary>
            /// <param name="parameter">The random number generator to use.</param>
            private void ThreadProc(object parameter)
            {
                Random           rand        = (Random)parameter;
                Int32ColumnValue columnValue = new Int32ColumnValue();

                this.startEvent.WaitOne();
                for (int i = 0; i < N; ++i)
                {
                    int x = rand.Next();
                    columnValue.Value = x;
                    object obj = columnValue.ValueAsObject;
                    Assert.AreEqual(x, obj);
                }

                if (0 == Interlocked.Decrement(ref this.activeThreads))
                {
                    this.stopEvent.Set();
                }
            }
        public MerkleTreeNode ReadNode()
        {
            var blockIndexColumn = new Int32ColumnValue { Columnid = cursor.blockIndexColumnId };
            var txIndexColumn = new Int32ColumnValue { Columnid = cursor.txIndexColumnId };
            var depthColumn = new Int32ColumnValue { Columnid = cursor.blockDepthColumnId };
            var txHashColumn = new BytesColumnValue { Columnid = cursor.blockTxHashColumnId };
            Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, blockIndexColumn, txIndexColumn, depthColumn, txHashColumn);

            if (this.blockIndex != blockIndexColumn.Value.Value)
                throw new InvalidOperationException();

            var txIndex = txIndexColumn.Value.Value;
            var depth = depthColumn.Value.Value;
            var txHash = DbEncoder.DecodeUInt256(txHashColumn.Value);

            var pruned = depth >= 0;
            depth = Math.Max(0, depth);

            return new MerkleTreeNode(txIndex, depth, txHash, pruned);
        }
Exemple #16
0
        public void WriteNode(BlockTxNode node)
        {
            if (!node.Pruned)
            {
                throw new ArgumentException();
            }

            var recordBlockIndexColumn = new Int32ColumnValue {
                Columnid = cursor.blockIndexColumnId
            };
            var recordTxIndexColumn = new Int32ColumnValue {
                Columnid = cursor.txIndexColumnId
            };

            Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, recordBlockIndexColumn, recordTxIndexColumn);

            if (this.blockIndex != recordBlockIndexColumn.Value.Value)
            {
                throw new InvalidOperationException();
            }
            if (node.Index != recordTxIndexColumn.Value.Value)
            {
                throw new InvalidOperationException();
            }

            using (var jetUpdate = cursor.jetSession.BeginUpdate(cursor.blocksTableId, JET_prep.Replace))
            {
                Api.SetColumns(cursor.jetSession, cursor.blocksTableId,
                               new Int32ColumnValue {
                    Columnid = cursor.blockDepthColumnId, Value = node.Depth
                },
                               new BytesColumnValue {
                    Columnid = cursor.blockTxHashColumnId, Value = DbEncoder.EncodeUInt256(node.Hash)
                },
                               new Int32ColumnValue {
                    Columnid = cursor.blockTxBytesColumnId, Value = null
                });

                jetUpdate.Save();
            }
        }
        private void InitColumns()
        {
            _colIdGeometryLabel    = Api.GetTableColumnid(Sesid, Table, ColNameGeometryLabel);
            _colIdGeomType         = Api.GetTableColumnid(Sesid, Table, ColNameGeomType);
            _colIdProductIfcTypeId = Api.GetTableColumnid(Sesid, Table, ColNameProductIfcTypeId);
            _colIdProductLabel     = Api.GetTableColumnid(Sesid, Table, ColNameProductLabel);
            _colIdSubPart          = Api.GetTableColumnid(Sesid, Table, ColNameSubPart);
            _colIdTransformMatrix  = Api.GetTableColumnid(Sesid, Table, ColNameTransformMatrix);
            _colIdShapeData        = Api.GetTableColumnid(Sesid, Table, ColNameShapeData);
            _colIdGeometryHash     = Api.GetTableColumnid(Sesid, Table, ColNameGeometryHash);
            _colIdStyleLabel       = Api.GetTableColumnid(Sesid, Table, ColNameStyleLabel);

            _colValGeometryLabel = new Int32ColumnValue {
                Columnid = _colIdGeometryLabel
            };
            _colValGeomType = new ByteColumnValue {
                Columnid = _colIdGeomType
            };
            _colValProductIfcTypeId = new Int16ColumnValue {
                Columnid = _colIdProductIfcTypeId
            };
            _colValProductLabel = new Int32ColumnValue {
                Columnid = _colIdProductLabel
            };
            _colValSubPart = new Int16ColumnValue {
                Columnid = _colIdSubPart
            };
            _colValTransformMatrix = new BytesColumnValue {
                Columnid = _colIdTransformMatrix
            };
            _colValShapeData = new BytesColumnValue {
                Columnid = _colIdShapeData
            };
            _colValGeometryHash = new Int32ColumnValue {
                Columnid = _colIdGeometryHash
            };
            _colValStyleLabel = new Int32ColumnValue {
                Columnid = _colIdStyleLabel
            };
            _colValues = new ColumnValue[] { _colValGeomType, _colValProductLabel, _colValProductIfcTypeId, _colValSubPart, _colValTransformMatrix, _colValShapeData, _colValGeometryHash, _colValStyleLabel };
        }
Exemple #18
0
        private void InitColumns()
        {
            // IDictionary<string, JET_COLUMNID> columnids = Api.GetColumnDictionary(_jetSession, _jetCursor);
            _colIdHeaderId    = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameHeaderId);
            _colIdEntityCount = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameEntityCount);
            _colIdFileVersion = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameFileVersion);
            _colIdHeaderData  = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameHeaderData);

            _colValHeaderId = new Int32ColumnValue {
                Columnid = _colIdHeaderId
            };
            _colValEntityCount = new Int64ColumnValue {
                Columnid = _colIdEntityCount
            };
            _colValFileVersion = new StringColumnValue {
                Columnid = _colIdFileVersion
            };
            _colValHeaderData = new BytesColumnValue {
                Columnid = _colIdHeaderData
            };
        }
Exemple #19
0
        /// <summary>
        /// 获取列对应 LdapDisplayName
        /// </summary>
        /// <param name="mSysObjects"></param>
        /// <returns></returns>
        private Dictionary <string, string> EnumerateDatatableTableLdapDisplayNames(MSysObjectsRow[] mSysObjects)
        {
            var ldapDisplayNameToColumnNameDictionary = new Dictionary <string, string>();
            var unmatchedCount = 0;

            wrn = Api.JetOpenTable(sesId, dbId, DATATABLE, null, 0, OpenTableGrbit.ReadOnly | OpenTableGrbit.Sequential, out _tableid);
            if (wrn == JET_wrn.Success)
            {
                // 获取将列名称映射到列ID的字典
                var columnDictionary = Api.GetColumnDictionary(sesId, _tableid);
                // 遍历所有表
                Api.MoveBeforeFirst(sesId, _tableid);
                while (Api.TryMoveNext(sesId, _tableid))
                {
                    var ldapDisplayNameColumn = new StringColumnValue {
                        Columnid = columnDictionary["ATTm131532"]
                    };
                    var attributeIdColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["ATTc131102"]
                    };
                    Api.RetrieveColumns(sesId, _tableid, attributeIdColumn, ldapDisplayNameColumn);
                    if (attributeIdColumn.Value != null)
                    {
                        if (Array.Find(mSysObjects, x => x.AttributeId == attributeIdColumn.Value) == null)
                        {
                            unmatchedCount++;
                        }
                        else
                        {
                            //Console.WriteLine(mSysObjects.First(x => x.AttributeId == attributeIdColumn.Value).ColumnName + ldapDisplayNameColumn.Value);
                            ldapDisplayNameToColumnNameDictionary.Add(ldapDisplayNameColumn.Value, mSysObjects.First(x => x.AttributeId == attributeIdColumn.Value).ColumnName);
                        }
                    }
                }
                //var pekListColumn = new BytesColumnValue { Columnid = columnDictionary[ldapDisplayNameToColumnNameDictionary["pekList"]] };
                //Console.WriteLine(pekListColumn);
            }

            return(ldapDisplayNameToColumnNameDictionary);
        }
Exemple #20
0
        private void InitColumns()
        {
            // The main entity Table
            _colIdEntityLabel = Api.GetTableColumnid(Sesid, Table, colNameEntityLabel);

            _colIdIfcType        = Api.GetTableColumnid(Sesid, Table, colNameIfcType);
            _colIdEntityData     = Api.GetTableColumnid(Sesid, Table, colNameEntityData);
            _colIdIsIndexedClass = Api.GetTableColumnid(Sesid, Table, colNameIsIndexedClass);
            _colValEntityLabel   = new Int32ColumnValue {
                Columnid = _colIdEntityLabel
            };
            _colValTypeId = new Int16ColumnValue {
                Columnid = _colIdIfcType
            };

            _colValData = new BytesColumnValue {
                Columnid = _colIdEntityData
            };
            _colValIsIndexedClass = new BoolColumnValue {
                Columnid = _colIdIsIndexedClass
            };
            _colValues = new ColumnValue[] { _colValEntityLabel, _colValTypeId, _colValData, _colValIsIndexedClass };

            //The index table
            _colIdIdxIfcType  = Api.GetTableColumnid(Sesid, _indexTable, colNameIfcType);
            _colValIdxIfcType = new Int16ColumnValue {
                Columnid = _colIdIdxIfcType
            };
            _colIdIdxKey  = Api.GetTableColumnid(Sesid, _indexTable, colNameSecondaryKey);
            _colValIdxKey = new Int32ColumnValue {
                Columnid = _colIdIdxKey
            };
            _colIdIdxEntityLabel  = Api.GetTableColumnid(Sesid, _indexTable, colNameEntityLabel);
            _colValIdxEntityLabel = new Int32ColumnValue {
                Columnid = _colIdIdxEntityLabel
            };
            _colIdxValues = new ColumnValue[] { _colValIdxIfcType, _colValIdxKey, _colValIdxEntityLabel };
        }
        private void InitColumns()
        {

            _colIdShapeLabel = Api.GetTableColumnid(sesid, table, colNameShapeLabel);
            _colIdIfcShapeLabel = Api.GetTableColumnid(sesid, table, colNameIfcShapeLabel);
            _colIdGeometryHash = Api.GetTableColumnid(sesid, table, colNameGeometryHash);
            _colIdCost = Api.GetTableColumnid(sesid, table, colNameCost);
            _colIdReferenceCount = Api.GetTableColumnid(sesid, table, colNameReferenceCount);
            _colIdLOD = Api.GetTableColumnid(sesid, table, colNameLOD);
            _colIdFormat = Api.GetTableColumnid(sesid, table, colNameFormat);
            _colIdBoundingBox = Api.GetTableColumnid(sesid, table, colNameBoundingBox);
            _colIdShapeData = Api.GetTableColumnid(sesid, table, colNameShapeData);

            _colValShapeLabel = new Int32ColumnValue { Columnid = _colIdShapeLabel };
            _colValIfcShapeLabel = new Int32ColumnValue { Columnid = _colIdIfcShapeLabel };
            _colValGeometryHash = new Int32ColumnValue { Columnid = _colIdGeometryHash };
            _colValCost = new Int32ColumnValue { Columnid = _colIdCost };
            _colValReferenceCount = new Int32ColumnValue { Columnid = _colIdReferenceCount };
            _colValLOD = new ByteColumnValue { Columnid = _colIdLOD };
            _colValFormat = new ByteColumnValue { Columnid = _colIdFormat };
            _colValBoundingBox = new BytesColumnValue { Columnid = _colIdBoundingBox };
            _colValShapeData = new BytesColumnValue { Columnid = _colIdShapeData }; 


            _colValues = new ColumnValue[] { _colValIfcShapeLabel, _colValGeometryHash, _colValCost, _colValReferenceCount, _colValLOD, _colValFormat,_colValBoundingBox,_colValShapeData };



        }
        private void InitColumns()
        {
           // IDictionary<string, JET_COLUMNID> columnids = Api.GetColumnDictionary(_jetSession, _jetCursor);
            _colIdHeaderId = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameHeaderId);
            _colIdEntityCount = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameEntityCount);
            _colIdFileVersion = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameFileVersion);
            _colIdHeaderData = Api.GetTableColumnid(_jetSession, _jetCursor, _colNameHeaderData);
            
            _colValHeaderId = new Int32ColumnValue { Columnid = _colIdHeaderId };
            _colValEntityCount = new Int64ColumnValue { Columnid = _colIdEntityCount };
            _colValFileVersion = new StringColumnValue { Columnid = _colIdFileVersion };
            _colValHeaderData = new BytesColumnValue { Columnid = _colIdHeaderData };
           

        }
        private void InitColumns()
        {
            _colIdInstanceLabel = Api.GetTableColumnid(sesid, table, colNameInstanceLabel);
            _colIdIfcTypeId = Api.GetTableColumnid(sesid, table, colNameIfcTypeId);
            _colIdIfcProductLabel = Api.GetTableColumnid(sesid, table, colNameIfcProductLabel);
            _colIdStyleLabel = Api.GetTableColumnid(sesid, table, colNameStyleLabel);
            _colIdShapeLabel = Api.GetTableColumnid(sesid, table, colNameShapeLabel);
            _colIdRepresentationContext = Api.GetTableColumnid(sesid, table, colNameRepresentationContext);
            _colIdRepType = Api.GetTableColumnid(sesid, table, colNameRepType);
            _colIdTransformation = Api.GetTableColumnid(sesid, table, colNameTransformation);
            _colIdBoundingBox = Api.GetTableColumnid(sesid, table, colNameBoundingBox);

            _colValInstanceLabel = new Int32ColumnValue { Columnid = _colIdInstanceLabel };
            _colValIfcTypeId = new Int16ColumnValue { Columnid = _colIdIfcTypeId };
            _colValIfcProductLabel = new Int32ColumnValue { Columnid = _colIdIfcProductLabel };
            _colValStyleLabel = new Int32ColumnValue { Columnid = _colIdStyleLabel };
            _colValShapeLabel = new Int32ColumnValue { Columnid = _colIdShapeLabel };
            _colValRepresentationContext = new Int32ColumnValue { Columnid = _colIdRepresentationContext };
            _colValRepType = new ByteColumnValue { Columnid = _colIdRepType };
            _colValTransformation = new BytesColumnValue { Columnid = _colIdTransformation };
            _colValBoundingBox = new BytesColumnValue { Columnid = _colIdBoundingBox };

            _colValues = new ColumnValue[] { _colValIfcTypeId, _colValIfcProductLabel, _colValStyleLabel, _colValShapeLabel, _colValRepresentationContext, _colValRepType, _colValTransformation,_colValBoundingBox, };
        }
        /// <summary>
        /// Retrieve columns using the basic RetrieveColumns API.
        /// </summary>
        private void RetrieveWithRetrieveColumns()
        {
            var boolColumn = new BoolColumnValue { Columnid = this.columnidDict["boolean"] };
            var int32Column = new Int32ColumnValue { Columnid = this.columnidDict["int32"] };
            var int64Column = new Int64ColumnValue { Columnid = this.columnidDict["int64"] };
            var guidColumn = new GuidColumnValue { Columnid = this.columnidDict["guid"] };
            var stringColumn = new StringColumnValue { Columnid = this.columnidDict["unicode"] };

            var retrievecolumns = new ColumnValue[]
            {
                boolColumn,
                int32Column,
                int64Column,
                guidColumn,
                stringColumn,
            };

            for (int i = 0; i < NumRetrieves; ++i)
            {
                Api.JetBeginTransaction(this.session);

                Api.RetrieveColumns(this.session, this.tableid, retrievecolumns);

                bool actualBool = (bool)boolColumn.Value;
                int actualInt32 = (int)int32Column.Value;
                long actualInt64 = (long)int64Column.Value;
                Guid actualGuid = (Guid)guidColumn.Value;
                string actualString = stringColumn.Value;

                Assert.AreEqual(this.expectedBool, actualBool);
                Assert.AreEqual(this.expectedInt32, actualInt32);
                Assert.AreEqual(this.expectedInt64, actualInt64);
                Assert.AreEqual(this.expectedGuid, actualGuid);
                Assert.AreEqual(this.expectedString, actualString);

                Api.JetCommitTransaction(this.session, CommitTransactionGrbit.None);
            }
        }
Exemple #25
0
        private static DatatableRow[] EnumerateDatatableTable(JetDb db, IReadOnlyDictionary <string, string> ldapDisplayNameToDatatableColumnNameDictionary, bool dumpHashes, bool includeHistoryHashes)
        {
            Stopwatch stopwatch = null;

            if (ShowDebugOutput)
            {
                ConsoleEx.WriteDebug($"Called: {nameof(NtdsAudit)}::{nameof(EnumerateDatatableTable)}");
                stopwatch = new Stopwatch();
                stopwatch.Start();
            }

            var datatable    = new List <DatatableRow>();
            var deletedCount = 0;

            using (var table = db.OpenJetDbTable(DATATABLE))
            {
                // Get a dictionary mapping column names to column ids
                var columnDictionary = table.GetColumnDictionary();

                // Loop over the table
                table.MoveBeforeFirst();
                while (table.TryMoveNext())
                {
                    var accountExpiresColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["accountExpires"]]
                    };
                    var displayNameColumn = new StringColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["displayName"]]
                    };
                    var distinguishedNameTagColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["DNT_col"]
                    };
                    var groupTypeColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["groupType"]]
                    };
                    var isDeletedColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["isDeleted"]]
                    };
                    var lastLogonColumn = new LdapDateTimeColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["lastLogonTimestamp"]]
                    };
                    var lmColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["dBCSPwd"]]
                    };
                    var lmHistoryColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["lmPwdHistory"]]
                    };
                    var nameColumn = new StringColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["name"]]
                    };
                    var ntColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["unicodePwd"]]
                    };
                    var ntHistoryColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["ntPwdHistory"]]
                    };
                    var objColumn = new BoolColumnValue {
                        Columnid = columnDictionary["OBJ_col"]
                    };
                    var objectCategoryColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["objectCategory"]]
                    };
                    var objectSidColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["objectSid"]]
                    };
                    var parentDistinguishedNameTagColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["PDNT_col"]
                    };
                    var passwordLastSetColumn = new LdapDateTimeColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["pwdLastSet"]]
                    };
                    var pekListColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["pekList"]]
                    };
                    var primaryGroupIdColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["primaryGroupID"]]
                    };
                    var rdnTypeColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["RDNtyp_col"]
                    };                                                                                      // The RDNTyp_col holds the Attribute-ID for the attribute being used as the RDN, such as CN, OU, DC
                    var samAccountNameColumn = new StringColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["sAMAccountName"]]
                    };
                    var timeColumn = new LdapDateTimeColumnValue {
                        Columnid = columnDictionary["time_col"]
                    };
                    var userAccountControlColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["userAccountControl"]]
                    };
                    var supplementalCredentialsColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["supplementalCredentials"]]
                    };

                    var columns = new List <ColumnValue>
                    {
                        accountExpiresColumn,
                        displayNameColumn,
                        distinguishedNameTagColumn,
                        groupTypeColumn,
                        isDeletedColumn,
                        lastLogonColumn,
                        nameColumn,
                        objColumn,
                        objectCategoryColumn,
                        objectSidColumn,
                        parentDistinguishedNameTagColumn,
                        passwordLastSetColumn,
                        primaryGroupIdColumn,
                        rdnTypeColumn,
                        samAccountNameColumn,
                        timeColumn,
                        userAccountControlColumn,
                    };

                    if (dumpHashes)
                    {
                        columns.Add(pekListColumn);
                        columns.Add(lmColumn);
                        columns.Add(ntColumn);
                        columns.Add(supplementalCredentialsColumn);

                        if (includeHistoryHashes)
                        {
                            columns.Add(lmHistoryColumn);
                            columns.Add(ntHistoryColumn);
                        }
                    }

                    table.RetrieveColumns(columns.ToArray());

                    // Skip deleted objects
                    if (isDeletedColumn.Value.HasValue && isDeletedColumn.Value != 0)
                    {
                        deletedCount++;
                        continue;
                    }

                    // Some deleted objects do not have the isDeleted flag but do have a string appended to the DN (https://support.microsoft.com/en-us/help/248047/phantoms--tombstones-and-the-infrastructure-master)
                    if (nameColumn.Value?.Contains("\nDEL:") ?? false)
                    {
                        deletedCount++;
                        continue;
                    }

                    SecurityIdentifier sid = null;
                    uint rid = 0;
                    if (objectSidColumn.Error == JET_wrn.Success)
                    {
                        var sidBytes = objectSidColumn.Value;
                        var ridBytes = sidBytes.Skip(sidBytes.Length - sizeof(int)).Take(sizeof(int)).Reverse().ToArray();
                        sidBytes = sidBytes.Take(sidBytes.Length - sizeof(int)).Concat(ridBytes).ToArray();
                        rid      = BitConverter.ToUInt32(ridBytes, 0);
                        sid      = new SecurityIdentifier(sidBytes, 0);
                    }

                    var row = new DatatableRow
                    {
                        AccountExpires          = accountExpiresColumn.Value,
                        DisplayName             = displayNameColumn.Value,
                        Dnt                     = distinguishedNameTagColumn.Value,
                        GroupType               = groupTypeColumn.Value,
                        LastLogon               = lastLogonColumn.Value,
                        Name                    = nameColumn.Value,
                        ObjectCategoryDnt       = objectCategoryColumn.Value,
                        Rid                     = rid,
                        Sid                     = sid,
                        ParentDnt               = parentDistinguishedNameTagColumn.Value,
                        Phantom                 = objColumn.Value == false,
                        LastPasswordChange      = passwordLastSetColumn.Value,
                        PrimaryGroupDnt         = primaryGroupIdColumn.Value,
                        RdnType                 = rdnTypeColumn.Value,
                        SamAccountName          = samAccountNameColumn.Value,
                        UserAccountControlValue = userAccountControlColumn.Value,
                    };

                    if (dumpHashes)
                    {
                        if (pekListColumn.Value != null)
                        {
                            row.PekList = pekListColumn.Value;
                        }

                        if (lmColumn.Value != null)
                        {
                            row.EncryptedLmHash = lmColumn.Value;
                        }

                        if (ntColumn.Value != null)
                        {
                            row.EncryptedNtHash = ntColumn.Value;
                        }

                        if (includeHistoryHashes)
                        {
                            if (lmHistoryColumn.Value != null)
                            {
                                row.EncryptedLmHistory = lmHistoryColumn.Value;
                            }

                            if (ntHistoryColumn.Value != null)
                            {
                                row.EncryptedNtHistory = ntHistoryColumn.Value;
                            }
                        }

                        if (supplementalCredentialsColumn.Value != null)
                        {
                            row.SupplementalCredentialsBlob = supplementalCredentialsColumn.Value;
                        }
                    }

                    datatable.Add(row);
                }
            }

            if (ShowDebugOutput)
            {
                ConsoleEx.WriteDebug($"  Skipped {deletedCount} deleted objects");
                ConsoleEx.WriteDebug($"  Enumerated {datatable.Count} objects");

                stopwatch.Stop();
                ConsoleEx.WriteDebug($"  Completed in {stopwatch.Elapsed}");
            }

            return(datatable.ToArray());
        }
        private IEnumerator<BlockTxNode> ReadBlockTransactions(UInt256 blockHash, bool requireTx)
        {
            using (var handle = this.cursorCache.TakeItem())
            {
                var cursor = handle.Item;

                using (var jetTx = cursor.jetSession.BeginTransaction())
                {
                    int blockIndex;
                    if (!TryGetBlockIndex(cursor, blockHash, out blockIndex))
                        throw new MissingDataException(blockHash);

                    Api.JetSetCurrentIndex(cursor.jetSession, cursor.blocksTableId, "IX_BlockIndexTxIndex");

                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, 0, MakeKeyGrbit.None);
                    if (!Api.TrySeek(cursor.jetSession, cursor.blocksTableId, SeekGrbit.SeekGE))
                        throw new MissingDataException(blockHash);

                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, int.MaxValue, MakeKeyGrbit.None);
                    if (!Api.TrySetIndexRange(cursor.jetSession, cursor.blocksTableId, SetIndexRangeGrbit.RangeUpperLimit))
                        throw new MissingDataException(blockHash);

                    do
                    {
                        var txIndexColumn = new Int32ColumnValue { Columnid = cursor.txIndexColumnId };
                        var blockDepthColumn = new Int32ColumnValue { Columnid = cursor.blockDepthColumnId };
                        var blockTxHashColumn = new BytesColumnValue { Columnid = cursor.blockTxHashColumnId };
                        var blockTxBytesColumn = new BytesColumnValue { Columnid = cursor.blockTxBytesColumnId };
                        Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, txIndexColumn, blockDepthColumn, blockTxHashColumn, blockTxBytesColumn);

                        var txIndex = txIndexColumn.Value.Value;
                        var depth = blockDepthColumn.Value.Value;
                        var txHash = DbEncoder.DecodeUInt256(blockTxHashColumn.Value);
                        var txBytes = blockTxBytesColumn.Value;

                        // determine if transaction is pruned by its depth
                        var pruned = depth >= 0;
                        depth = Math.Max(0, depth);

                        if (pruned && requireTx)
                            throw new MissingDataException(blockHash);

                        var blockTxNode = new BlockTxNode(txIndex, depth, txHash, pruned, txBytes?.ToImmutableArray());

                        yield return blockTxNode;
                    }
                    while (Api.TryMoveNext(cursor.jetSession, cursor.blocksTableId));
                }
            }
        }
        public void WriteNode(MerkleTreeNode node)
        {
            if (!node.Pruned)
                throw new ArgumentException();

            var recordBlockIndexColumn = new Int32ColumnValue { Columnid = cursor.blockIndexColumnId };
            var recordTxIndexColumn = new Int32ColumnValue { Columnid = cursor.txIndexColumnId };
            Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, recordBlockIndexColumn, recordTxIndexColumn);

            if (this.blockIndex != recordBlockIndexColumn.Value.Value)
                throw new InvalidOperationException();
            if (node.Index != recordTxIndexColumn.Value.Value)
                throw new InvalidOperationException();

            using (var jetUpdate = cursor.jetSession.BeginUpdate(cursor.blocksTableId, JET_prep.Replace))
            {
                Api.SetColumns(cursor.jetSession, cursor.blocksTableId,
                    new Int32ColumnValue { Columnid = cursor.blockDepthColumnId, Value = node.Depth },
                    new BytesColumnValue { Columnid = cursor.blockTxHashColumnId, Value = DbEncoder.EncodeUInt256(node.Hash) },
                    new Int32ColumnValue { Columnid = cursor.blockTxBytesColumnId, Value = null });

                jetUpdate.Save();
            }
        }
        private IEnumerable<UnspentTx> ReadUnspentTransactionsInner()
        {
            using (SetSessionContext())
            {
                Api.JetSetCurrentIndex(this.jetSession, this.unspentTxTableId, "IX_TxHash");

                if (Api.TryMoveFirst(this.jetSession, this.unspentTxTableId))
                {
                    do
                    {
                        var txHashColumn = new BytesColumnValue { Columnid = this.txHashColumnId };
                        var blockIndexColumn = new Int32ColumnValue { Columnid = this.blockIndexColumnId };
                        var txIndexColumn = new Int32ColumnValue { Columnid = this.txIndexColumnId };
                        var txVersionColumn = new UInt32ColumnValue { Columnid = this.txVersionColumnId };
                        var isCoinbaseColumn = new BoolColumnValue { Columnid = this.isCoinbaseColumnId };
                        var outputStatesColumn = new BytesColumnValue { Columnid = this.outputStatesColumnId };
                        var txOutputBytesColumn = new BytesColumnValue { Columnid = this.txOutputBytesColumnId };
                        Api.RetrieveColumns(this.jetSession, this.unspentTxTableId, txHashColumn, blockIndexColumn, txIndexColumn, txVersionColumn, isCoinbaseColumn, outputStatesColumn, txOutputBytesColumn);

                        var txHash = DbEncoder.DecodeUInt256(txHashColumn.Value);
                        var blockIndex = blockIndexColumn.Value.Value;
                        var txIndex = txIndexColumn.Value.Value;
                        var txVersion = txVersionColumn.Value.Value;
                        var isCoinbase = isCoinbaseColumn.Value.Value;
                        var outputStates = DataDecoder.DecodeOutputStates(outputStatesColumn.Value);

                        yield return new UnspentTx(txHash, blockIndex, txIndex, txVersion, isCoinbase, outputStates);
                    }
                    while (Api.TryMoveNext(this.jetSession, this.unspentTxTableId));
                }
            }
        }
        public bool TryGetUnspentTx(UInt256 txHash, out UnspentTx unspentTx)
        {
            CheckTransaction();

            using (SetSessionContext())
            {
                Api.JetSetCurrentIndex(this.jetSession, this.unspentTxTableId, "IX_TxHash");
                Api.MakeKey(this.jetSession, this.unspentTxTableId, DbEncoder.EncodeUInt256(txHash), MakeKeyGrbit.NewKey);
                if (Api.TrySeek(this.jetSession, this.unspentTxTableId, SeekGrbit.SeekEQ))
                {
                    var blockIndexColumn = new Int32ColumnValue { Columnid = this.blockIndexColumnId };
                    var txIndexColumn = new Int32ColumnValue { Columnid = this.txIndexColumnId };
                    var txVersionColumn = new UInt32ColumnValue { Columnid = this.txVersionColumnId };
                    var isCoinbaseColumn = new BoolColumnValue { Columnid = this.isCoinbaseColumnId };
                    var outputStatesColumn = new BytesColumnValue { Columnid = this.outputStatesColumnId };
                    var txOutputBytesColumn = new BytesColumnValue { Columnid = this.txOutputBytesColumnId };
                    Api.RetrieveColumns(this.jetSession, this.unspentTxTableId, blockIndexColumn, txIndexColumn, txVersionColumn, isCoinbaseColumn, outputStatesColumn, txOutputBytesColumn);

                    var blockIndex = blockIndexColumn.Value.Value;
                    var txIndex = txIndexColumn.Value.Value;
                    var txVersion = txVersionColumn.Value.Value;
                    var isCoinbase = isCoinbaseColumn.Value.Value;
                    var outputStates = DataDecoder.DecodeOutputStates(outputStatesColumn.Value);

                    unspentTx = new UnspentTx(txHash, blockIndex, txIndex, txVersion, isCoinbase, outputStates);
                    return true;
                }

                unspentTx = default(UnspentTx);
                return false;
            }
        }
Exemple #30
0
        private DatatableRow[] EnumerateDatatableTable(Dictionary <string, string> ldapDisplayNameToDatatableColumnNameDictionary)
        {
            var datatable    = new List <DatatableRow>();
            var deletedCount = 0;

            wrn = Api.JetOpenTable(sesId, dbId, DATATABLE, null, 0, OpenTableGrbit.ReadOnly | OpenTableGrbit.Sequential, out _tableid);
            if (wrn == JET_wrn.Success)
            {
                // 获取将列名称映射到列ID的字典
                var columnDictionary = Api.GetColumnDictionary(sesId, _tableid);
                // 遍历所有表
                Api.MoveBeforeFirst(sesId, _tableid);
                while (Api.TryMoveNext(sesId, _tableid))
                {
                    var accountExpiresColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["accountExpires"]]
                    };
                    var displayNameColumn = new StringColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["displayName"]]
                    };
                    var distinguishedNameTagColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["DNT_col"]
                    };
                    var groupTypeColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["groupType"]]
                    };
                    var isDeletedColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["isDeleted"]]
                    };
                    var lastLogonColumn = new LdapDateTimeColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["lastLogonTimestamp"]]
                    };
                    var lmColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["dBCSPwd"]]
                    };
                    var lmHistoryColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["lmPwdHistory"]]
                    };
                    var nameColumn = new StringColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["name"]]
                    };
                    var ntColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["unicodePwd"]]
                    };
                    var ntHistoryColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["ntPwdHistory"]]
                    };
                    var objColumn = new BoolColumnValue {
                        Columnid = columnDictionary["OBJ_col"]
                    };
                    var objectCategoryColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["objectCategory"]]
                    };
                    var objectSidColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["objectSid"]]
                    };
                    var parentDistinguishedNameTagColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["PDNT_col"]
                    };
                    var passwordLastSetColumn = new LdapDateTimeColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["pwdLastSet"]]
                    };
                    var pekListColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["pekList"]]
                    };
                    var primaryGroupIdColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["primaryGroupID"]]
                    };
                    var rdnTypeColumn = new Int32ColumnValue {
                        Columnid = columnDictionary["RDNtyp_col"]
                    };                                                                                      // The RDNTyp_col holds the Attribute-ID for the attribute being used as the RDN, such as CN, OU, DC
                    var samAccountNameColumn = new StringColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["sAMAccountName"]]
                    };
                    var timeColumn = new LdapDateTimeColumnValue {
                        Columnid = columnDictionary["time_col"]
                    };
                    var userAccountControlColumn = new Int32ColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["userAccountControl"]]
                    };
                    var supplementalCredentialsColumn = new BytesColumnValue {
                        Columnid = columnDictionary[ldapDisplayNameToDatatableColumnNameDictionary["supplementalCredentials"]]
                    };

                    var columns = new List <ColumnValue>
                    {
                        accountExpiresColumn,
                        displayNameColumn,
                        distinguishedNameTagColumn,
                        groupTypeColumn,
                        isDeletedColumn,
                        lastLogonColumn,
                        nameColumn,
                        objColumn,
                        objectCategoryColumn,
                        objectSidColumn,
                        parentDistinguishedNameTagColumn,
                        passwordLastSetColumn,
                        primaryGroupIdColumn,
                        rdnTypeColumn,
                        samAccountNameColumn,
                        timeColumn,
                        userAccountControlColumn,
                        // dumpHashes
                        pekListColumn,
                        lmColumn,
                        ntColumn,
                        supplementalCredentialsColumn,
                        // includeHistoryHashes
                        lmHistoryColumn,
                        ntHistoryColumn,
                    };
                    Api.RetrieveColumns(sesId, _tableid, columns.ToArray());

                    // 跳过删除的对象
                    if (isDeletedColumn.Value.HasValue && isDeletedColumn.Value != 0)
                    {
                        deletedCount++;
                        continue;
                    }

                    // 一些已删除的对象没有isDeleted标志,但确实在DN后面附加了一个字符串 (https://support.microsoft.com/en-us/help/248047/phantoms--tombstones-and-the-infrastructure-master)
                    if (nameColumn.Value?.Contains("\nDEL:") ?? false)
                    {
                        deletedCount++;
                        continue;
                    }

                    SecurityIdentifier sid = null;
                    uint rid = 0;
                    if (objectSidColumn.Error == JET_wrn.Success)
                    {
                        var sidBytes = objectSidColumn.Value;
                        var ridBytes = sidBytes.Skip(sidBytes.Length - sizeof(int)).Take(sizeof(int)).Reverse().ToArray();
                        sidBytes = sidBytes.Take(sidBytes.Length - sizeof(int)).Concat(ridBytes).ToArray();
                        rid      = BitConverter.ToUInt32(ridBytes, 0);
                        sid      = new SecurityIdentifier(sidBytes, 0);
                    }
                    var row = new DatatableRow
                    {
                        AccountExpires          = accountExpiresColumn.Value,
                        DisplayName             = displayNameColumn.Value,
                        Dnt                     = distinguishedNameTagColumn.Value,
                        GroupType               = groupTypeColumn.Value,
                        LastLogon               = lastLogonColumn.Value,
                        Name                    = nameColumn.Value,
                        ObjectCategoryDnt       = objectCategoryColumn.Value,
                        Rid                     = rid,
                        Sid                     = sid,
                        ParentDnt               = parentDistinguishedNameTagColumn.Value,
                        Phantom                 = objColumn.Value == false,
                        LastPasswordChange      = passwordLastSetColumn.Value,
                        PrimaryGroupDnt         = primaryGroupIdColumn.Value,
                        RdnType                 = rdnTypeColumn.Value,
                        SamAccountName          = samAccountNameColumn.Value,
                        UserAccountControlValue = userAccountControlColumn.Value,
                    };

                    if (pekListColumn.Value != null)
                    {
                        row.PekList = pekListColumn.Value;
                    }

                    if (lmColumn.Value != null)
                    {
                        row.EncryptedLmHash = lmColumn.Value;
                    }

                    if (ntColumn.Value != null)
                    {
                        row.EncryptedNtHash = ntColumn.Value;
                    }

                    if (lmHistoryColumn.Value != null)
                    {
                        row.EncryptedLmHistory = lmHistoryColumn.Value;
                    }

                    if (ntHistoryColumn.Value != null)
                    {
                        row.EncryptedNtHistory = ntHistoryColumn.Value;
                    }

                    if (supplementalCredentialsColumn.Value != null)
                    {
                        row.SupplementalCredentialsBlob = supplementalCredentialsColumn.Value;
                    }

                    datatable.Add(row);
                }
            }
            return(datatable.ToArray());
        }
 public void TestInt32ColumnValueToString()
 {
     var instance = new Int32ColumnValue { Value = 5 };
     Assert.AreEqual("5", instance.ToString());
 }
Exemple #32
0
        private IEnumerator <BlockTxNode> ReadBlockTransactions(UInt256 blockHash, bool requireTx)
        {
            using (var handle = this.cursorCache.TakeItem())
            {
                var cursor = handle.Item;

                using (var jetTx = cursor.jetSession.BeginTransaction())
                {
                    int blockIndex;
                    if (!TryGetBlockIndex(cursor, blockHash, out blockIndex))
                    {
                        throw new MissingDataException(blockHash);
                    }

                    Api.JetSetCurrentIndex(cursor.jetSession, cursor.blocksTableId, "IX_BlockIndexTxIndex");

                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, 0, MakeKeyGrbit.None);
                    if (!Api.TrySeek(cursor.jetSession, cursor.blocksTableId, SeekGrbit.SeekGE))
                    {
                        throw new MissingDataException(blockHash);
                    }

                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, blockIndex, MakeKeyGrbit.NewKey);
                    Api.MakeKey(cursor.jetSession, cursor.blocksTableId, int.MaxValue, MakeKeyGrbit.None);
                    if (!Api.TrySetIndexRange(cursor.jetSession, cursor.blocksTableId, SetIndexRangeGrbit.RangeUpperLimit))
                    {
                        throw new MissingDataException(blockHash);
                    }

                    do
                    {
                        var txIndexColumn = new Int32ColumnValue {
                            Columnid = cursor.txIndexColumnId
                        };
                        var blockDepthColumn = new Int32ColumnValue {
                            Columnid = cursor.blockDepthColumnId
                        };
                        var blockTxHashColumn = new BytesColumnValue {
                            Columnid = cursor.blockTxHashColumnId
                        };
                        var blockTxBytesColumn = new BytesColumnValue {
                            Columnid = cursor.blockTxBytesColumnId
                        };
                        Api.RetrieveColumns(cursor.jetSession, cursor.blocksTableId, txIndexColumn, blockDepthColumn, blockTxHashColumn, blockTxBytesColumn);

                        var txIndex = txIndexColumn.Value.Value;
                        var depth   = blockDepthColumn.Value.Value;
                        var txHash  = DbEncoder.DecodeUInt256(blockTxHashColumn.Value);
                        var txBytes = blockTxBytesColumn.Value;

                        // determine if transaction is pruned by its depth
                        var pruned = depth >= 0;
                        depth = Math.Max(0, depth);

                        if (pruned && requireTx)
                        {
                            throw new MissingDataException(blockHash);
                        }

                        var blockTxNode = new BlockTxNode(txIndex, depth, txHash, pruned, txBytes?.ToImmutableArray());

                        yield return(blockTxNode);
                    }while (Api.TryMoveNext(cursor.jetSession, cursor.blocksTableId));
                }
            }
        }
        private void InitColumns()
        {

            _colIdGeometryLabel = Api.GetTableColumnid(sesid, table, colNameGeometryLabel);
            _colIdGeomType = Api.GetTableColumnid(sesid, table, colNameGeomType);
            _colIdProductIfcTypeId = Api.GetTableColumnid(sesid, table, colNameProductIfcTypeId);
            _colIdProductLabel = Api.GetTableColumnid(sesid, table, colNameProductLabel);
            _colIdSubPart = Api.GetTableColumnid(sesid, table, colNameSubPart);
            _colIdTransformMatrix = Api.GetTableColumnid(sesid, table, colNameTransformMatrix);
            _colIdShapeData = Api.GetTableColumnid(sesid, table, colNameShapeData);
            _colIdGeometryHash = Api.GetTableColumnid(sesid, table, colNameGeometryHash);
            _colIdStyleLabel = Api.GetTableColumnid(sesid, table, colNameStyleLabel);

            _colValGeometryLabel = new Int32ColumnValue { Columnid = _colIdGeometryLabel };
            _colValGeomType = new ByteColumnValue { Columnid = _colIdGeomType };
            _colValProductIfcTypeId = new Int16ColumnValue { Columnid = _colIdProductIfcTypeId };
            _colValProductLabel = new Int32ColumnValue { Columnid = _colIdProductLabel };
            _colValSubPart = new Int16ColumnValue { Columnid = _colIdSubPart };
            _colValTransformMatrix = new BytesColumnValue { Columnid = _colIdTransformMatrix };
            _colValShapeData = new BytesColumnValue { Columnid = _colIdShapeData };
            _colValGeometryHash = new Int32ColumnValue { Columnid = _colIdGeometryHash };
            _colValStyleLabel = new Int32ColumnValue { Columnid = _colIdStyleLabel };
            _colValues = new ColumnValue[] { _colValGeomType, _colValProductLabel, _colValProductIfcTypeId, _colValSubPart, _colValTransformMatrix, _colValShapeData, _colValGeometryHash , _colValStyleLabel};

        }