コード例 #1
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetStoragePools(ref List <StoragePool> pools)
        {
            SpacesApiError spacesApiError = SpacesApiError.Success;

            try
            {
                ManagementObjectCollection managementObjectCollection = null;
                spacesApiError = SpacesApi.GetStorageObjectsByQuery("Select * From MSFT_StoragePool", ref managementObjectCollection);
                if (spacesApiError != SpacesApiError.Success)
                {
                    return(spacesApiError);
                }
                foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
                {
                    ManagementObject m           = (ManagementObject)managementBaseObject;
                    StoragePool      storagePool = new StoragePool();
                    storagePool.FromManagementObject(m);
                    pools.Add(storagePool);
                }
            }
            catch (Exception ex)
            {
                spacesApiError = SpacesApiError.Failed;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to get storage pools: {0}", new object[]
                    {
                        ex
                    });
                }
            }
            return(spacesApiError);
        }
コード例 #2
0
        public override StorApiStatus UpdateDrives()
        {
            StorApiStatus result = StorApiStatusEnum.STOR_NO_ERROR;

            if (this.drives != null)
            {
                this.drives.Clear();
            }
            List <PhysicalDisk> list          = new List <PhysicalDisk>();
            SpacesApiError      physicalDisks = SpacesApi.SpacesApi.GetPhysicalDisks(ref list);

            if (physicalDisks != SpacesApiError.Success)
            {
                Logger.Error("GetPhysicalDiskDisks returned error: {0}", new object[]
                {
                    physicalDisks
                });
                return(SpacesUtil.ToStorApiStatus(physicalDisks));
            }
            foreach (PhysicalDisk pd in list)
            {
                SpacesDrive item = this.MakeDrive(pd);
                this.drives.Add(item);
            }
            return(result);
        }
コード例 #3
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetVirtualDisks(ref List <VirtualDisk> disks)
        {
            SpacesApiError spacesApiError = SpacesApiError.Success;

            try
            {
                ManagementObjectCollection managementObjectCollection = null;
                spacesApiError = SpacesApi.GetStorageObjectsByQuery("Select * From MSFT_VirtualDisk", ref managementObjectCollection);
                if (spacesApiError != SpacesApiError.Success)
                {
                    return(spacesApiError);
                }
                foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
                {
                    ManagementObject m           = (ManagementObject)managementBaseObject;
                    VirtualDisk      virtualDisk = new VirtualDisk();
                    virtualDisk.FromManagementObject(m);
                    disks.Add(virtualDisk);
                }
            }
            catch (Exception ex)
            {
                spacesApiError = SpacesApiError.Failed;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to get virtual disks: {0}", new object[]
                    {
                        ex
                    });
                }
            }
            return(spacesApiError);
        }
コード例 #4
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetPhysicalDiskPool(string pdid, ref StoragePool pool)
        {
            SpacesApiError     spacesApiError = SpacesApiError.Success;
            List <StoragePool> list           = null;

            pool           = null;
            spacesApiError = SpacesApi.GetPhysicalDiskPools(pdid, ref list);
            if (spacesApiError == SpacesApiError.Success)
            {
                if (list.Count == 1)
                {
                    pool = list[0];
                }
                else
                {
                    foreach (StoragePool storagePool in list)
                    {
                        if (!storagePool.IsPrimordial)
                        {
                            pool = storagePool;
                            break;
                        }
                    }
                }
            }
            return(spacesApiError);
        }
コード例 #5
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        protected static SpacesApiError ConnectToStorageScope()
        {
            SpacesApiError result = SpacesApiError.Success;

            try
            {
                SpacesApi.scope = new ManagementScope(SpacesApi.StorageNamespace);
                SpacesApi.scope.Connect();
            }
            catch (Exception ex)
            {
                result          = SpacesApiError.Failed;
                SpacesApi.scope = null;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to connect to {0}: {1}", new object[]
                    {
                        SpacesApi.StorageNamespace,
                        ex.ToString()
                    });
                }
                throw ex;
            }
            return(result);
        }
コード例 #6
0
        public virtual StorApiStatus GetDrivePool(Drive drive, ref SpacesPool pool)
        {
            StorApiStatus  storApiStatus  = StorApiStatusEnum.STOR_NO_ERROR;
            SpacesApiError spacesApiError = SpacesApiError.Success;

            if (drive == null)
            {
                return(StorApiStatusEnum.STOR_INVALID_PARAM);
            }
            StoragePool storagePool = null;

            spacesApiError = SpacesApi.SpacesApi.GetPhysicalDiskPool(drive.Id, ref storagePool);
            if (spacesApiError == SpacesApiError.Success && storagePool != null)
            {
                foreach (SpacesPool spacesPool in this.pools)
                {
                    if (string.Equals(spacesPool.Id, storagePool.ObjectId, StringComparison.OrdinalIgnoreCase))
                    {
                        pool = spacesPool;
                        break;
                    }
                }
            }
            return(SpacesUtil.ToStorApiStatus(spacesApiError));
        }
コード例 #7
0
        public override StorApiStatus UpdateVolumes()
        {
            StorApiStatus result = StorApiStatusEnum.STOR_NO_ERROR;

            if (this.volumes != null)
            {
                this.volumes.Clear();
            }
            List <VirtualDisk> list         = new List <VirtualDisk>();
            SpacesApiError     virtualDisks = SpacesApi.SpacesApi.GetVirtualDisks(ref list);

            if (virtualDisks != SpacesApiError.Success)
            {
                Logger.Error("GetVirtualDisks returned error: {0}", new object[]
                {
                    virtualDisks
                });
                return(SpacesUtil.ToStorApiStatus(virtualDisks));
            }
            foreach (VirtualDisk d in list)
            {
                this.volumes.Add(this.MakeVolume(d));
            }
            return(result);
        }
コード例 #8
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        protected static SpacesApiError GetWin32ObjectsByQuery(string query, ref ManagementObjectCollection collection)
        {
            SpacesApiError           result = SpacesApiError.Success;
            ObjectQuery              query2 = new ObjectQuery(query);
            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(query2);

            collection = managementObjectSearcher.Get();
            return(result);
        }
コード例 #9
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetStorageEventWatcher(string query, ref ManagementEventWatcher watcher)
        {
            SpacesApiError result = SpacesApiError.Success;

            if (SpacesApi.GetStorageScope() == null)
            {
                result = SpacesApiError.Failed;
            }
            else
            {
                watcher = new ManagementEventWatcher(query);
            }
            return(result);
        }
コード例 #10
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError ConvertError(object status)
        {
            SpacesApiError result = SpacesApiError.Unknown;

            try
            {
                result = (SpacesApiError)Enum.ToObject(typeof(SpacesApiError), status);
            }
            catch (Exception)
            {
                result = SpacesApiError.Unknown;
            }
            return(result);
        }
コード例 #11
0
ファイル: SpacesUtil.cs プロジェクト: eXpl0it3r/Sentinel
        public static StorApiStatus Initialize()
        {
            SpacesApiError spacesApiError = SpacesApiError.Success;

            if (!SpacesUtil.apiInitialized)
            {
                spacesApiError = SpacesApi.SpacesApi.Initialize();
                if (spacesApiError == SpacesApiError.Success)
                {
                    SpacesUtil.apiInitialized = true;
                }
            }
            return(SpacesUtil.ToStorApiStatus(spacesApiError));
        }
コード例 #12
0
        public StorApiStatus GetSpacesDrive(string serial, ref SpacesDrive drive)
        {
            StorApiStatus  result        = StorApiStatusEnum.STOR_NO_ERROR;
            PhysicalDisk   physicalDisk  = null;
            SpacesApiError physicalDisk2 = SpacesApi.SpacesApi.GetPhysicalDisk(serial, ref physicalDisk);

            if (physicalDisk2 != SpacesApiError.Success)
            {
                return(SpacesUtil.ToStorApiStatus(physicalDisk2));
            }
            if (physicalDisk != null)
            {
                drive = this.MakeDrive(physicalDisk);
            }
            return(result);
        }
コード例 #13
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetStorageObjectsByQuery(string query, ref ManagementObjectCollection collection)
        {
            SpacesApiError  result       = SpacesApiError.Success;
            ManagementScope storageScope = SpacesApi.GetStorageScope();

            if (storageScope == null)
            {
                result = SpacesApiError.Failed;
            }
            else
            {
                ObjectQuery query2 = new ObjectQuery(query);
                ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(storageScope, query2);
                collection = managementObjectSearcher.Get();
            }
            return(result);
        }
コード例 #14
0
ファイル: SpacesUtil.cs プロジェクト: eXpl0it3r/Sentinel
        public static StorApiStatus ToStorApiStatus(SpacesApiError apierr)
        {
            StorApiStatus storApiStatus = new StorApiStatus(StorApiStatusEnum.STOR_NO_ERROR);

            storApiStatus.internalIntData = (int)apierr;
            switch (apierr)
            {
            case SpacesApiError.Success:
                storApiStatus.status = StorApiStatusEnum.STOR_NO_ERROR;
                return(storApiStatus);

            case SpacesApiError.NotSupported:
                storApiStatus.status = StorApiStatusEnum.STOR_NOT_SUPPORTED;
                return(storApiStatus);

            case SpacesApiError.Unknown:
                storApiStatus.status = StorApiStatusEnum.STOR_UNKNOWN_ERROR;
                return(storApiStatus);

            case SpacesApiError.Timeout:
                storApiStatus.status = StorApiStatusEnum.STOR_TIME_OUT;
                return(storApiStatus);

            case SpacesApiError.Failed:
                break;

            case SpacesApiError.InvalidParameter:
                storApiStatus.status = StorApiStatusEnum.STOR_INVALID_PARAM;
                return(storApiStatus);

            default:
                if (apierr == SpacesApiError.NotEnoughResources)
                {
                    storApiStatus.status = StorApiStatusEnum.STOR_OUT_OF_MEMORY;
                    return(storApiStatus);
                }
                break;
            }
            storApiStatus.status = StorApiStatusEnum.STOR_API_ERROR;
            return(storApiStatus);
        }
コード例 #15
0
        public virtual StorApiStatus UpdatePools()
        {
            StorApiStatus result = StorApiStatusEnum.STOR_NO_ERROR;

            if (this.pools != null)
            {
                this.pools.Clear();
            }
            List <StoragePool> list         = new List <StoragePool>();
            SpacesApiError     storagePools = SpacesApi.SpacesApi.GetStoragePools(ref list);

            if (storagePools != SpacesApiError.Success)
            {
                return(SpacesUtil.ToStorApiStatus(storagePools));
            }
            foreach (StoragePool d in list)
            {
                this.pools.Add(this.MakePool(d));
            }
            return(result);
        }
コード例 #16
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError SetPoolAttributes(string PoolId, StoragePoolAttributes attrs)
        {
            SpacesApiError result = SpacesApiError.Success;

            try
            {
                ManagementObject     managementObject = new ManagementObject(SpacesApi.GetStorageScope(), new ManagementPath("MSFT_StoragePool.ObjectId='" + PoolId + "'"), null);
                ManagementBaseObject methodParameters = managementObject.GetMethodParameters("SetAttributes");
                if (attrs.IsPowerProtected.IsPropertySet)
                {
                    methodParameters["IsPowerProtected"] = attrs.IsPowerProtected;
                }
                if (attrs.ClearOnDeallocate.IsPropertySet)
                {
                    methodParameters["ClearOnDeallocate"] = attrs.ClearOnDeallocate;
                }
                if (attrs.RetireMissingPhysicalDisks.IsPropertySet)
                {
                    methodParameters["RetireMissingPhysicalDisks"] = attrs.RetireMissingPhysicalDisks;
                }
                if (attrs.ThinProvisioningAlertThresholds.IsPropertySet)
                {
                    methodParameters["ThinProvisioningAlertThresholds"] = attrs.ThinProvisioningAlertThresholds;
                }
                ManagementBaseObject managementBaseObject = managementObject.InvokeMethod("SetAttributes", methodParameters, null);
                result = SpacesApi.ConvertError(managementBaseObject["returnValue"]);
            }
            catch (Exception ex)
            {
                result = SpacesApiError.Failed;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to set pool attributes: {0}", new object[]
                    {
                        ex
                    });
                }
            }
            return(result);
        }
コード例 #17
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetPhysicalDisk(string serial, ref PhysicalDisk disk)
        {
            SpacesApiError spacesApiError = SpacesApiError.Success;

            try
            {
                ManagementObjectCollection managementObjectCollection = null;
                disk = null;
                string query = string.Format("Select * From MSFT_PhysicalDisk Where SerialNumber like '%{0}'", serial);
                spacesApiError = SpacesApi.GetStorageObjectsByQuery(query, ref managementObjectCollection);
                if (spacesApiError != SpacesApiError.Success)
                {
                    return(spacesApiError);
                }
                foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
                {
                    ManagementObject m = (ManagementObject)managementBaseObject;
                    string           b = SpacesApiUtil.GetManagementObjectValue <string>(m, "SerialNumber").Trim();
                    if (serial == b)
                    {
                        disk = new PhysicalDisk();
                        disk.FromManagementObject(m);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                spacesApiError = SpacesApiError.Failed;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to get physical disk: {0}", new object[]
                    {
                        ex
                    });
                }
            }
            return(spacesApiError);
        }
コード例 #18
0
        public virtual StorApiStatus GetVolumeDrives(Volume volume, ref List <Drive> voldrives)
        {
            StorApiStatus  storApiStatus  = StorApiStatusEnum.STOR_NO_ERROR;
            SpacesApiError spacesApiError = SpacesApiError.Success;

            if (volume == null)
            {
                return(StorApiStatusEnum.STOR_INVALID_PARAM);
            }
            List <PhysicalDisk> list = new List <PhysicalDisk>();

            spacesApiError = SpacesApi.SpacesApi.GetPhysicalDisksForVirtualDisk(volume.Id, ref list);
            if (spacesApiError == SpacesApiError.Success)
            {
                foreach (PhysicalDisk pd in list)
                {
                    SpacesDrive item = this.MakeDrive(pd);
                    voldrives.Add(item);
                }
            }
            return(SpacesUtil.ToStorApiStatus(spacesApiError));
        }
コード例 #19
0
        public virtual StorApiStatus IsDriveConfiguredForSpaces(Drive drive, ref bool configured)
        {
            StorApiStatus storApiStatus = StorApiStatusEnum.STOR_NO_ERROR;

            if (drive == null)
            {
                return(StorApiStatusEnum.STOR_INVALID_PARAM);
            }
            StoragePool    storagePool      = null;
            SpacesApiError physicalDiskPool = SpacesApi.SpacesApi.GetPhysicalDiskPool(drive.Id, ref storagePool);

            if (physicalDiskPool == SpacesApiError.Success)
            {
                if (storagePool == null)
                {
                    configured = false;
                }
                else
                {
                    configured = !storagePool.IsPrimordial;
                }
            }
            return(SpacesUtil.ToStorApiStatus(physicalDiskPool));
        }
コード例 #20
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetPhysicalDiskPools(string pdid, ref List <StoragePool> pools)
        {
            SpacesApiError spacesApiError = SpacesApiError.Success;

            pools = new List <StoragePool>();
            List <StoragePool> list = new List <StoragePool>();

            try
            {
                spacesApiError = SpacesApi.GetStoragePools(ref list);
                if (spacesApiError != SpacesApiError.Success)
                {
                    SpacesApi.Debug("GetPhysicalDiskPools failed to get pools", new object[0]);
                    return(spacesApiError);
                }
                if (list.Count == 0 || (list.Count == 1 && list[0].IsPrimordial))
                {
                    SpacesApi.Debug("GetPhysicalDiskPools only primordial pool existss", new object[0]);
                    return(spacesApiError);
                }
                Regex regex  = new Regex("(.+)MSFT_StoragePool.ObjectId=\"(.+)\"$");
                Regex regex2 = new Regex("(.+)MSFT_PhysicalDisk.ObjectId=\"(.+)\"$");
                ManagementObjectCollection managementObjectCollection = null;
                spacesApiError = SpacesApi.GetStorageObjectsByQuery("Select * from MSFT_StoragePoolToPhysicalDisk", ref managementObjectCollection);
                if (spacesApiError != SpacesApiError.Success)
                {
                    SpacesApi.Debug("GetPhysicalDiskPools failed to get MSFT_StoragePoolToPhysicalDisk", new object[0]);
                    return(spacesApiError);
                }
                foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
                {
                    ManagementObject managementObject = (ManagementObject)managementBaseObject;
                    string           text             = null;
                    string           text2            = null;
                    if (managementObject["PhysicalDisk"] != null)
                    {
                        Match match = regex2.Match((string)managementObject["PhysicalDisk"]);
                        if (match.Success && match.Groups.Count > 2)
                        {
                            text2 = match.Groups[2].Value;
                            text2 = SpacesApi.UnescapeString(text2);
                            if (!string.Equals(text2, pdid, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }
                        }
                    }
                    if (text2 != null && managementObject["StoragePool"] != null)
                    {
                        Match match2 = regex.Match((string)managementObject["StoragePool"]);
                        if (match2.Success && match2.Groups.Count > 2)
                        {
                            text = match2.Groups[2].Value;
                            text = SpacesApi.UnescapeString(text);
                        }
                    }
                    if (text != null)
                    {
                        foreach (StoragePool storagePool in list)
                        {
                            if (string.Equals(text, storagePool.ObjectId, StringComparison.OrdinalIgnoreCase))
                            {
                                pools.Add(storagePool);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                spacesApiError = SpacesApiError.Failed;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to get storage pools for physical disk {1}: {0}", new object[]
                    {
                        ex,
                        pdid
                    });
                }
            }
            return(spacesApiError);
        }
コード例 #21
0
ファイル: SpacesApi.cs プロジェクト: eXpl0it3r/Sentinel
        public static SpacesApiError GetVirtualDisksForPhysicalDisk(string pdid, ref List <VirtualDisk> disks)
        {
            SpacesApiError spacesApiError = SpacesApiError.Success;

            try
            {
                Regex regex  = new Regex("(.+)MSFT_VirtualDisk.ObjectId=\"([{}0-9a-zA-Z-]+)\"");
                Regex regex2 = new Regex("(.+)MSFT_PhysicalDisk.ObjectId=\"([{}0-9a-zA-Z-]+)\"");
                ManagementObjectCollection managementObjectCollection = null;
                spacesApiError = SpacesApi.GetStorageObjectsByQuery("Select * from MSFT_VirtualDiskToPhysicalDisk", ref managementObjectCollection);
                if (spacesApiError != SpacesApiError.Success)
                {
                    return(spacesApiError);
                }
                foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
                {
                    ManagementObject managementObject = (ManagementObject)managementBaseObject;
                    string           text             = null;
                    string           text2            = null;
                    if (managementObject["PhysicalDisk"] != null)
                    {
                        Match match = regex2.Match((string)managementObject["PhysicalDisk"]);
                        if (match.Success && match.Groups.Count > 2)
                        {
                            text2 = match.Groups[2].Value;
                            if (text2 != pdid)
                            {
                                continue;
                            }
                        }
                    }
                    if (text2 != null && managementObject["VirtualDisk"] != null)
                    {
                        Match match2 = regex.Match((string)managementObject["VirtualDisk"]);
                        if (match2.Success && match2.Groups.Count > 2)
                        {
                            text = match2.Groups[2].Value;
                        }
                    }
                    if (text != null)
                    {
                        ManagementObjectCollection managementObjectCollection2 = null;
                        spacesApiError = SpacesApi.GetStorageObjectsByQuery("Select * From MSFT_VirtualDisk where ObjectId = '" + text + "'", ref managementObjectCollection2);
                        if (spacesApiError != SpacesApiError.Success)
                        {
                            return(spacesApiError);
                        }
                        foreach (ManagementBaseObject managementBaseObject2 in managementObjectCollection2)
                        {
                            ManagementObject m           = (ManagementObject)managementBaseObject2;
                            VirtualDisk      virtualDisk = new VirtualDisk();
                            virtualDisk.FromManagementObject(m);
                            if (disks == null)
                            {
                                disks = new List <VirtualDisk>();
                            }
                            disks.Add(virtualDisk);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                spacesApiError = SpacesApiError.Failed;
                if (SpacesApi.DebugOn)
                {
                    SpacesApi.Debug("Failed to get virtual disks for physical disk {1}: {0}", new object[]
                    {
                        ex,
                        pdid
                    });
                }
            }
            return(spacesApiError);
        }