Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2015, 21:16   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию WMI Редактирование свойств.

Всем доброго. Понадобилось удаленно изменить на куче компов описание и имя компа. Решил прибегнуть к WMI, но не к WSH, а прикрутить такую возможность к уже готовому нативному проекту.
Использую такой код:
Код:
program WMIXE;

{$APPTYPE CONSOLE}


uses
  ActiveX,
  comobj,
  classes,
  contnrs,
  variants,
  SysUtils;

  var
  objSWbemLocator,objWMIService,Records:OleVariant;
  id:IDispatch; Enum,PropEnum:IEnumVariant;
  Obj,ObjRec,FWbemObject:OleVariant;
  i:Cardinal;
  Host,Root,Login,Password:String;
begin
 Host:='.';
 Root:='root\cimv2';
 Login:='';
 Password:='';

  CoInitialize(nil);
  objSWbemLocator:=CreateOleObject('WbemScripting.SWbemLocator');
  if not VarIsClear(objSWbemLocator) then begin
     objWMIService:=objSWbemLocator.ConnectServer(Host,Root,Login,Password,'','',0,id);
     if not VarIsClear(objWMIService) then begin
        Obj:=objWMIService.Get('Win32_OperatingSystem');
        ObjRec:=Obj.Properties_.Item('Description');
        writeln(ObjRec.Value);
        ObjRec.Value:='Tottoro';
        Obj.Put_;
      end else begin
      writeln('Error on ConnectServer');
     end;
  end else begin
   writeln('Error on CreateOleObject(WbemScripting.SWbemLocator)');
  end;
  CoUninitialize;

 readln;
end.
Фишка в том что он новое значение где-то запоминает, но не там где я хочу. После отработки программы если открыть свойства компа и посмотреть на поле описания, там ничего не изменяется, т.е. этого значения, что я программой устанавливаю там не появляется.

Вопросы:
1) А правильно ли я вообще делаю? Может по другому нужно значения устанавливать?
2) Может кто в курсе как в нативке поменять имя компа и его описание? Через WMI желательно, но подойдут и др. способы.

P.S. Скрин прикладываю, чтоб было понятно что хочу поменять:
Безымянный.jpg
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.03.2015, 21:24   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А в ObjRec.Value что после смены? Может программа без прав админа запускается? (UAC)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.03.2015, 22:13   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Именно после смены? Не проверял, но после перезапуска там точно новая строка. В данном случае Tottoro. Я для этого и прилепил writeln(ObjRec.Value); чтоб посмотреть что было до изменения и после перезапуска.

Забабахал так:
Код:
        Obj:=objWMIService.Get('Win32_OperatingSystem');
        ObjRec:=Obj.Properties_.Item('Description');
        writeln(ObjRec.Value);
        Randomize;
        ObjRec.Value:=DateTimeToStr(now)+IntToStr(Random(1000));
        Obj.Put_;
Результ тот же - запоминает где-то после перезапуска.
Причем хоть с правами админа хоть просто так значение сохраняет.
Но все равно не там где хочется:
Безымянный.jpg
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.03.2015, 16:27   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Допишу может кому пригодится: выкрутился вызовом VBS такого вида:
Код:
Sub main()
        Set objWMIService = GetObject("winmgmts:\\127.0.0.1).InstancesOf("Win32_OperatingSystem")
        For Each x In objWMIService
            x.Description = "Текст описания компа"
            x.Put_
        Next
End sub
Засовываю его в такой код:
Код:
var iVBS:OleVariant;code:TStringList;
...
     CoInitialize(nil);
     iVBS:=CreateOleObject('MSScriptControl.ScriptControl');
     iVBS.Language:='VBScript';
     iVBS.UseSafeSubset := False;
     iVBS.AllowUI := true;
     iVBS.TimeOut := -1;
     iVBS.Reset;

    iVBS.AddCode(code.Text);
    iVBS.Run('main');

   iVBS:=Unassigned;
   CoUninitialize;
Скрипт в code толкаю.

Это конечно костылевасто выглядит, но хотя бы работает. Как я понял из MSDN СОМ API WMI урезано жутко (а мож не так понял...) в пользу скриптов Микрософта.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WMI AppData Общие вопросы Delphi 13 06.02.2015 16:00
WMI No_Comments Помощь студентам 3 19.10.2012 22:37
Редактирование свойств объектов blacklight Microsoft Office Excel 5 12.08.2009 19:26
Редактирование свойств обьекта VB6 DimaLiS Помощь студентам 10 06.08.2009 13:30
Редактирование свойств форм tae1980 Microsoft Office Excel 4 22.03.2009 09:47