Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

Сервис не ShutDownит сервер с выданными привилегиями.   Найти похожие ветки 

 
Kacnep ©   (2006-08-25 07:45) [0]

Ув. мастера! Сервис по приходу некой команды из сети должен выполнить *.cmd файл. Вот что например
c:\adm\ss.cmd
shutdown /s /f >c:\adm\log.txt
т.е. выключить сервер, но этого не происходит.
Сам командник запускается! Файл log.txt появляется.
Привелегии необходимые вроде бы выдал - не уверен что в том месте программы.
Сервис запускается как Local System.
Может кто нить что подсказать (сервера 2000 и 2003).
Я рассматривал пример
http://delphimaster.net/view/4-1147525423/Вот куски кода...

....

procedure AdjTokenPrivelegs(mmName: string);
var
 gler: DWord;
begin
 AdjustPriviliges(mmName);
 gler:=GetLastError;
 if (gler<>ERROR_SUCCESS) then begin
   WriteLog(Format("%s: [FAILED] ", [mmName]));
{$IFDEF _DEV_}
   ShowError(gler);
{$ENDIF}
   exit;
 end;
 WriteLog(Format("%s: [OK] ", [mmName]));
end;

procedure Tf_Main.ServiceStart(Sender: TService; var Started: Boolean); //эта штука при старте сервера - тут и выдаю привилегии
var
 sl_Tmp:TStringList;
 s:string;
 i:integer;
begin
 Started:=FALSE;
 AdjTokenPrivelegs(SE_SHUTDOWN_NAME); //выдаем ЭТУ ТОЧНО ПРИВИЛЕГИЮ!!!
 AdjTokenPrivelegs(SE_DEBUG_NAME);
 WriteLog("Service is starting... ");

 if not StartServer then
   WriteLog("Error starting server")
 else WriteLog("Server started successfully!");
 WriteLog("Service is started.");

 Started:=TRUE;
end;

....

procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand); //это по приходу команды из сети использую компонент инди
var
 PMSI:TStartupInfo;
 PMPI:TProcessInformation;
begin
 WriteLog(ASender.Context.Connection.Socket.Binding.PeerIP+" -> Shutdown");
 if (FIP.Count>0) and (FIP.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
   WriteLog("Execute Shutdown! "+FScript);
   FillChar(PMSI,sizeof(PMSI),0);
   PMSI.cb:=sizeof(PMSI);
   FillChar(PMPI,sizeof(PMPI),0);
   try
     try      //Win32Check(
       if not CreateProcess(nil,PChar(FScript),nil,nil,true,0,{false,normal_priority_class,}ni l,nil,PMSI,PMPI) then RaiseLastWin32Error;
     except
       WriteLog("Error: "+SysErrorMessage(GetLastError));
     end;
   finally
     CloseHandle(PMPI.hProcess);
     CloseHandle(PMPI.hThread);
   end;
 end;//if
end;


 
Сергей М. ©   (2006-08-25 08:19) [1]


> Привелегии необходимые вроде бы выдал


Ты их кому выдал-то ? Сервису. А инициатором шатдауна кто является ? Совсем другой процесс, тот самый который у тебя скрипт исполняет. Вот как раз ему-то и нужны эти привелегии, а не сервису.


 
Сергей М. ©   (2006-08-25 08:21) [2]

И чем тебе Win32Check не угодил - тоже не понятно)


 
Kacnep ©   (2006-08-25 08:23) [3]

2 Сергей М.
Насчет Вин32Чек
Просто в доке про CreateProcess - сказано что он сам выдает код ошибки...
Не стал лишнюю ф-ю юзать. Но это ж не принципиально.
Насчет ДРУГОГО процесса - сейчас попробую...
Спасибо за советы!


 
Сергей М. ©   (2006-08-25 08:55) [4]


> в доке про CreateProcess - сказано что он сам выдает код
> ошибки


Ну так ты ж все равно при этом исключение возбуждаешь (см. raiselastwin32error)..

Конечно код

     try      
      if not CreateProcess(..) then RaiseLastWin32Error;
    except
      WriteLog("Error: "+SysErrorMessage(GetLastError));
    end;

полностью эквивалентен этому

     try      
      Win32Check(CreateProcess(..));
    except
      WriteLog("Error: "+SysErrorMessage(GetLastError));
    end;

но код с Win32Check и короче в написании и изящней ..


 
Kacnep ©   (2006-08-25 11:21) [5]

Люди :( не смог разобраться с правами - знаний не хватает.
А сейчас и времени.
Думал что проще получиться.
Общая ситуация такая.
ВНИМАНИЕ! На сервере никто не залогинен!!! Это обязан выполнить процесс!Преред выключением сервера - на нем должен выполниться скрипт гашения скажем оракловой базы.
Если я залогинюсь на сервак то гашу так.
sqlplus {если выполняет эту команду сервис - почему то требуется прописать пути а если вручную запускаю то пути берет из переменных окружения} /nolog @{путь где лежит\}скрипт гашение базы.
Потом выключаю сервер 2003
shutdown /s /f
Все эти команды и возможно другие должен выполнять мой
CreateProcess(nil,PChar(FScript),nil,nil,true,0,nil,nil,PMSI,PMPI);

Я даже не знаю как точно вопрос задать... %(
В общем надо как то процесс запуска скрипта наделить всеми! полномочиями администратора именно этого сервера на котором он выполняется.

Помогите. Тут у меня знаний не хватает. Нашел кучу примеров как наделять процесс какой то какими то правами - но какие конкретно мне нужны - не понимаю кроме seShutDown....


 
Сергей М. ©   (2006-08-25 11:38) [6]


> Нашел кучу примеров как наделять процесс какой то какими
> то правами


Показывай, как ты наделяешь стартуемый твоим сервисом процесс шатдаун-правом ..


 
Чапаев ©   (2006-08-25 11:45) [7]

> Все эти команды и возможно другие должен выполнять мой
> CreateProcess(nil,PChar(FScript),nil,nil,true,0,nil,nil,
> PMSI,PMPI);

Вообще кошернее выполнить cmd.exe, которому в качестве аргумента передаётся командный файл...


 
Ketmar ©   (2006-08-25 11:48) [8]

сильно подозреваю, что или никак, или неправильно. однозначно -- код в студию.


 
BiN ©   (2006-08-25 11:48) [9]


> Kacnep ©   (25.08.06 11:21) [5]


Компьютер при этом залочен?


 
Kacnep ©   (2006-08-25 12:05) [10]

так попорядку от простого к сложному...
2 BiN ©   (25.08.06 11:48) [9]
Мало того! На него никто и не заходил после перезагрузки! Установили сервис запустили в авто и ребутанули! Цель чтобы сервис уже работал (и он работает) и ожидал команды!
2 Чапаев
 Опять же... и СМД выполняется и пинг и прочие -простые команды "примитивные" а вот что то типа Шатдауна или... {блин кажется если я про Оракл вас загружу - уныло будет - там жопная аутентификация}
2 Остальные вот код но это только для Шатдауна!!! А мне требуется грубоговоря сделать копию списка админский прав!!!

procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand);
const
 PrivelegStr="SeShutdownPrivilege";
var
 PMSI:TStartupInfo;
 PMPI:TProcessInformation;
 hTok: THandle;
 tp: TTokenPrivileges;
begin
 WriteLog(ASender.Context.Connection.Socket.Binding.PeerIP+" -> Shutdown");
 if (FIP.Count>0) and (FIP.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
   WriteLog("Execute Shutdown! "+FScript);
   FillChar(PMSI,sizeof(PMSI),0);
   PMSI.cb:=sizeof(PMSI);
   FillChar(PMPI,sizeof(PMPI),0);
   try
     try
       Win32Check(CreateProcess(nil,PChar(FScript),nil,nil,false,0,{false,normal_priori ty_class,}nil,nil,PMSI,PMPI));
       if OpenProcessToken(PMPI.hProcess, TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY, hTok) then //я так понял тут начинаю работать с процессом
       try
         // Get the LUID for privilege.
         if LookupPrivilegeValue(nil, PChar(PrivelegStr),tp.Privileges[0].Luid) then begin
           tp.PrivilegeCount:=1; // one privilege to set
           tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
           // Get privilege for this process.
           AdjustTokenPrivileges(hTok,False,tp,0,PTokenPrivileges(nil)^, PDWord(nil)^);
         end
       finally
         // Cannot test the return value of AdjustTokenPrivileges.
         if (GetLastError <> ERROR_SUCCESS) then raise Exception.Create("AdjustTokenPrivileges enable failed");
         CloseHandle(hTok);
       end
       else raise Exception.Create("OpenProcessToken failed");
     except
       WriteLog("Error: "+SysErrorMessage(GetLastError));
     end;
   finally
     CloseHandle(PMPI.hProcess);
     CloseHandle(PMPI.hThread);
   end;
 end;//if
end;


 
Ketmar ©   (2006-08-25 12:11) [11]

> [10] Kacnep ©   (25.08.06 12:05)
CreateProcessAsUser()/LogonUser()?


 
Сергей М. ©   (2006-08-25 12:14) [12]


> Kacnep ©   (25.08.06 12:05) [10]


Вот ты стартовал процесс, он УЖЕ работает, УЖЕ выполняет скрипт и вероятно УЖЕ попытался шатдаун выполнить, а ты только еще чухнулся привелегии ему дать)

Стартуй процесс с опцией CREATE_SUSPENDED, назначай ему соотв.привелегии, и уж потом только толкай его на выполнение с этими привелегиями - ResumeThread(PMPI.hThread)


 
Kacnep ©   (2006-08-25 12:17) [13]

Спасибо Мастера! Все советы попробую!


 
BiN ©   (2006-08-25 12:19) [14]


> Kacnep ©   (25.08.06 12:05) [10]
>
> так попорядку от простого к сложному...
> 2 BiN ©   (25.08.06 11:48) [9]
> Мало того! На него никто и не заходил после перезагрузки!
>  Установили сервис запустили в авто и ребутанули! Цель чтобы
> сервис уже работал (и он работает) и ожидал команды!

Ок. Просто имей ввиду http://support.microsoft.com/?id=821287
Теперь по коду.
Запусти CreateProcess с флагом CREATE_SUSPENDED, а после установки привилегии возобнови работу с пом. ResumeThread.
Мелкое замечание по
 finally
        // Cannot test the return value of AdjustTokenPrivileges.
        if (GetLastError <> ERROR_SUCCESS) then raise Exception.Create("AdjustTokenPrivileges enable failed");
        CloseHandle(hTok);
      end

CloseHandle(hTok) должен стоять до возбуждения исключения.

Вот протестированная функция включения/выключения привилегий
function SetTokenPrivilege(hToken: THandle; const PrivilegeName:string;
                          NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
 LUID : TLargeInteger;
 Privilege, PrevPrivilege: TTokenPrivileges;
 cbPrevPriv:DWORD;
begin
 Result:= False;
 if LookupPrivilegeValue (nil, PChar (PrivilegeName), LUID) then
 begin
   Privilege.PrivilegeCount:=1;
   Privilege.Privileges[0].Luid:=LUID;
   Privilege.Privileges[0].Attributes:=NewState;
   cbPrevPriv := SizeOf (PrevPrivilege);
   Result:= AdjustTokenPrivileges(hToken, False, Privilege, cbPrevPriv, Privilege, cbPrevPriv);
   if Result and Assigned(PreState)
   then PreState^:=PrevPrivilege.Privileges[0].Attributes;
 end;
end;

// NewState - SE_PRIVILEGE_ENABLED или 0

function SetProcessTokenPrivilege(hProcess:DWORD; const PrivilegeName:string;
                          NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
 hToken : THandle;
begin
 Result:= False;
 if not OpenProcessToken(hProcess,
                     TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
                     hToken)
 then Exit;
 Result:=SetTokenPrivilege(hToken, PrivilegeName, NewState, PreState) and
         (GetLastError()=ERROR_SUCCESS);
 CloseHandle (hToken);
end;


 
Kacnep ©   (2006-08-25 12:22) [15]

Стоп!
А насчет Гашения базы.
В Оракле пользователькоторый может погасить "интерактивно" базу должен принадлежать группе ORA_DBA точно не помню...
Как Мной запущеный процесс поступит?
Или когда я говорю что процесс может шатдаунить машину ему выдаются привелегии АДМИНА который обладает правом ORA_DBA???


 
Kacnep ©   (2006-08-28 08:22) [16]

Пока не получилось вроде применял все рекомендации.
Вот ВСЕ исходники... Может кто поможет...
Прогу компилим
запускаем сначала с параметром /install - устанавливаем как сервис {убрать соответственно параметром /uninstall}
в папке с прогой должен быть инишник
В нем первый параметр - какой скрипт и откуда запускать
Второй параметр с какого ИП разрешено принимать команды.
После СТАРТА сервиса запускаем телнет на порт 9999 и просто посылаем команду shutdown.
Клиент сразу отцепиться а на серваке {2003 или ХР есть команда SHUTDOWN} должен выполниться Ваш скрипт.
Я буду еще искать решение проблемы. Но буду благодарен любому кто укажет где в программе ошибка. Спасибо.

settings.ini
[Script]
File=C:\Adm\ss.cmd
[IPs]
IP1=172.31.34.152
IP2=127.0.0.1


ss.cmd
shutdown -r -f

u_Main5.dfm

object f_Main: Tf_Main
 OldCreateOrder = False
 OnCreate = ServiceCreate
 OnDestroy = ServiceDestroy
 AllowPause = False
 DisplayName = "Ups_Listener"
 OnStart = ServiceStart
 OnStop = ServiceStop
 Left = 321
 Top = 150
 Height = 150
 Width = 215
 object id_Srv: TIdCmdTCPServer
   Bindings = <>
   DefaultPort = 9999
   TerminateWaitTime = 2000
   CommandHandlers = <
     item
       CmdDelimiter = " "
       Command = "SHUTDOWN"
       Disconnect = True
       Name = "ch_ShutDown"
       NormalReply.Code = "200"
       ParamDelimiter = " "
       Tag = 0
       OnCommand = id_SrvCommandHandlers0Command
     end>
   ExceptionReply.Code = "500"
   ExceptionReply.Text.Strings = (
     "Unknown Internal Error")
   Greeting.Code = "200"
   Greeting.Text.Strings = (
     "Welcome")
   HelpReply.Code = "100"
   HelpReply.Text.Strings = (
     "Help follows")
   MaxConnectionReply.Code = "300"
   MaxConnectionReply.Text.Strings = (
     "Too many connections. Try again later.")
   ReplyTexts = <>
   ReplyUnknownCommand.Code = "400"
   ReplyUnknownCommand.Text.Strings = (
     "Unknown Command")
   Left = 28
   Top = 26
 end
end


 
Kacnep ©   (2006-08-28 08:23) [17]

u_Main5.pas

unit u_Main5;

interface

uses
 Windows,
 Messages,
 SysUtils,
 Classes,
 SvcMgr,
 IniFiles,
 IdCmdTCPServer,IdCommandHandlers, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer;

type
 Tf_Main = class(TService)
   id_Srv: TIdCmdTCPServer;
   procedure id_SrvCommandHandlers0Command(ASender: TIdCommand);
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
   procedure ServiceCreate(Sender: TObject);
   procedure ServiceDestroy(Sender: TObject);
 private
   FIP:TStringList;
   FScript:string;
   function StartServer: Boolean;
   function StopServer: Boolean;
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

const
 c_Log="Service.log";
 c_Ini="settings.ini";

var
 f_Main: Tf_Main;

implementation

{$R *.DFM}

uses
 ShellAPI;

var
 CreateOptScan: LongWord;
 Log,Ini:TFileName;
 hLog: THandle;

 function WriteLog(Status: string): DWord; forward;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 f_Main.Controller(CtrlCode);
end;

function Tf_Main.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

function SetTokenPrivilege(hToken: THandle; const PrivilegeName:string; NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
 LUID : TLargeInteger;
 Privilege, PrevPrivilege: TTokenPrivileges;
 cbPrevPriv:DWORD;
begin
 Result:= False;
 if LookupPrivilegeValue (nil,PChar(PrivilegeName),LUID) then begin
   Privilege.PrivilegeCount:=1;
   Privilege.Privileges[0].Luid:=LUID;
   Privilege.Privileges[0].Attributes:=NewState;
   cbPrevPriv:=SizeOf(PrevPrivilege);
   Result:=AdjustTokenPrivileges(hToken, False, Privilege, cbPrevPriv, Privilege, cbPrevPriv);
   if (Result and Assigned(PreState)) then PreState^:=PrevPrivilege.Privileges[0].Attributes;
 end;
end;

function SetProcessTokenPrivilege(hProcess:DWORD; const PrivilegeName:string;NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
 hToken : THandle;
begin
 Result:= False;
 if not OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then begin
   WriteLog("OpenProcessToken [Fail]");
   Exit;
 end;
 Result:=SetTokenPrivilege(hToken, PrivilegeName, NewState, PreState) and (GetLastError=ERROR_SUCCESS);
 CloseHandle (hToken);
end;

procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand);
const
 PrivelegStr="SeShutdownPrivilege";
var
 PMSI:TStartupInfo;
 PMPI:TProcessInformation;
 env:array[0..100] of char;
begin
 WriteLog(ASender.Context.Connection.Socket.Binding.PeerIP+" -> Shutdown");
 if (FIP.Count>0) and (FIP.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
   WriteLog("Execute Shutdown! "+FScript);
   ZeroMemory(@env,sizeof(env));
   ZeroMemory(@PMSI,sizeof(PMSI));
   ZeroMemory(@PMPI,sizeof(PMPI));
   PMSI.cb:=sizeof(PMSI);
   try
     try
       Win32Check(CreateProcess(nil,PChar(FScript),nil,nil,true,CREATE_SUSPENDED,@env,P Char("C:\"),PMSI,PMPI));
       WriteLog("Create suspend process [OK]");
       SetProcessTokenPrivilege(PMPI.hProcess,PChar(PrivelegStr),SE_PRIVILEGE_ENABLED);
       WriteLog("SetProcessTokenPrivilege: "+SysErrorMessage(GetLastError));
       if GetLastError=ERROR_SUCCESS then begin
         ResumeThread(PMPI.hThread);
         WriteLog("ResumeThread: "+SysErrorMessage(GetLastError));
       end;
     except
       WriteLog("Error: "+SysErrorMessage(GetLastError));
     end;
   finally
     CloseHandle(PMPI.hProcess);
     CloseHandle(PMPI.hThread);
   end;
 end;//if
end;

function Tf_Main.StopServer: Boolean;
begin
 id_Srv.Active:=false;
 Result:=not id_Srv.Active;
 if result then WriteLog("Server stoped [OK]")
 else WriteLog("Server stoped [Fail]");
end;

function Tf_Main.StartServer: Boolean;
begin
 id_Srv.DefaultPort:=9999;
 try
   WriteLog("Server starting...");
   id_Srv.Active:=true;
   result:=id_Srv.Active;
 except
   on E : Exception do begin
     WriteLog("Server start [Fail]");
     WriteLog(E.Message);
     Result:=false;
   end;
 end;
end;

procedure Tf_Main.ServiceStart(Sender: TService; var Started: Boolean);
var
 sl_Tmp:TStringList;
 s:string;
 i:integer;
begin
 Started:=FALSE;
 Ini:=ExtractFilePath(paramstr(0))+c_Ini;
 Log:=ExtractFilePath(paramstr(0))+c_Log;
 WriteLog("Service is starting... ");
 FIP:=TStringList.Create;
 sl_Tmp:=TStringList.Create;
 try
   with TIniFile.Create(Ini) do begin
     FScript:=ReadString("Script","File","");
     ReadSection("IPs",sl_Tmp);
     for i:=0 to sl_Tmp.Count-1 do begin
       s:=trim(ReadString("IPs",sl_Tmp.Strings[i],""));
       if s<>"" then FIP.Add(s);
     end;
     Free;
   end;// WIth
 finally
   FreeAndNil(sl_Tmp);
 end;
 if not StartServer then begin
   WriteLog("Server start [Fail]");
   Started:=False;
 end
 else begin
   WriteLog("Server started [OK]");
   WriteLog("Service started [OK]");
   Started:=TRUE;
 end;
end;

procedure Tf_Main.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
 WriteLog("Service is stoping... ");
 if not StopServer then WriteLog("Server stop [Fail]");
 FreeAndNil(FIP);
 WriteLog("Service stoped [OK]");
 Stopped:=TRUE;
end;

procedure Tf_Main.ServiceCreate(Sender: TObject);
begin
 if sysutils.Win32Platform=VER_PLATFORM_WIN32_NT then CreateOptScan:=FILE_FLAG_SEQUENTIAL_SCAN
 else CreateOptScan:=0;
end;

function WriteLog(Status: string): DWord;
var
 xBuf: array[0..$FF - 1] of Char;
begin
 if (hLog = INVALID_HANDLE_VALUE) or (hLog = 0) then begin
   if FileExists(Log) then
     hLog := CreateFile(PChar(Log),
       GENERIC_READ or GENERIC_WRITE,
       FILE_SHARE_READ,
       nil,
       OPEN_EXISTING,
       FILE_ATTRIBUTE_NORMAL or CreateOptScan,
       0)
   else
     hLog := CreateFile(PChar(Log),
       GENERIC_READ or GENERIC_WRITE,
       FILE_SHARE_READ,
       nil,
       CREATE_ALWAYS,
       FILE_ATTRIBUTE_NORMAL or CreateOptScan,
       0);
  if hLog = INVALID_HANDLE_VALUE then begin
    Result := DWord(-1);
    exit;
  end;
  FileSeek(hLog, 0, 2);
 end;
 FillChar(xBuf, $FF, 0);
 Status := Format("[%s] %s"#13#10, [DateTimeTostr(Now), Status]);
 move((Pointer(@Status[1]))^, xBuf, Length(Status));
 FileWrite(hLog, xBuf, Length(Status));
 FlushFileBuffers(hLog);
 Result := 0;
end;

procedure Tf_Main.ServiceDestroy(Sender: TObject);
begin
 WriteLog("Service uninstall [OK]");
 CloseHandle(hLog);
end;

end.


 
Ketmar ©   (2006-08-28 10:10) [18]

* Кэтмар у утреннем настроении *
нет, я, конечно, всё понимаю, но ему за это, небось, денег платят, а мы тут так, забесплатно должны кучу кода читать...


 
Kacnep ©   (2006-08-28 10:57) [19]

:) Утром добрым... :)
Нет народ - это для облегчения моего гемороя :).
Если я доделаю этот сервис - то его скопировать и запустить на все серваки а их ооочень много :) не составит большого труда. А ЕСЛИ НЕТ... Придется официальный софт от производителся ставить и настраивать на каждой машине... ЭЭтого я вынести не смогу! :(((

А код - просто вставляеться в соответствующие файлы и компилиться -получаем готовый проект. Который уже можно просматривать. Вернее кажеться собака зарыта только в ф-ии создания процесса. Так сказать "код в студию".

Сейчас лазию по инету ищу примеры написания РАБОТАЮЩИХ сервисов.
Но все же основная надежда на Мастеров...


 
BiN ©   (2006-08-28 11:12) [20]


> Kacnep ©   (28.08.06 10:57) [19]

А можно узнать, что требуется еще от сообщества? Код что ли с нуля написать?

PS
GetLastError имеет смысл проверять только при неудачном выполнении функции (это я про вызов SetProcessTokenPrivilege)
PPS
"Простой" процесс, который только и делает, что пишет о себе в лог, создавать пробовал?


 
Kacnep ©   (2006-08-28 11:19) [21]

ДА! Все работает! И мало того скажем если я в файле ss.cmd (запускаемый сервисом скрипт) например пишу ping 127.0.0.1 >c:\adm\log.txt -в логе нормано вижу что команда пинг отработала. Сервис работает!!! Но когда на тачке никто не залогинен команда shutdown -r не работает! :((. Уже бесит этот кусок. :(
За замечания спасибо. Просто еще в коде много лишней отладочной инфы которая пишется в лог только для проверки.
Вот что например сейчас в ЛОГе
[28.08.2006 12:09:38] Service is stoping...
[28.08.2006 12:09:38] Server stoped [OK]
[28.08.2006 12:09:38] Service stoped [OK]
[28.08.2006 12:09:38] Service uninstall [OK]
[28.08.2006 12:09:53] Service is starting...
[28.08.2006 12:09:53] Server starting...
[28.08.2006 12:09:53] Server started [OK]
[28.08.2006 12:09:53] Service started [OK]
[28.08.2006 12:10:22] 172.31.39.233 -> Shutdown
[28.08.2006 12:10:22] Execute Shutdown! C:\ADM\ss.cmd
[28.08.2006 12:10:22] Create suspend process [OK]
[28.08.2006 12:10:22] SetProcessTokenPrivilege: The operation completed successfully
[28.08.2006 12:10:22] ResumeThread: The operation completed successfully


 
BiN ©   (2006-08-28 11:41) [22]

А без вызова shutdown.exe обойтись не хочешь? Например вызвать ExitWindowsEx или InitiateSystemShutdown(Ex)


 
Kacnep ©   (2006-08-28 11:54) [23]

:((
к сожалению не хочу...
Мне ВАЖНО чтоб ЛЮБАЯ программа прописаная в файле  "скрипта" нормально выполнялась. И ВОЗМОЖНО! потом шатдаун! Я например на критичных серваках просто остановлю и корректно завершу работу баз. Бэкапов и прочее. Это все я в скрипте пропишу! Вот для чего он нужен. А потом могу и шатдаунить спокойно. НО ЭТОТ ПРОЦЕСС!! будь он неладен :( не хочет ДАЖЕ шатдаун выполнить по всем рекомендациям Мастеров и хелпам инета. :(.
Сейчас работает примитивно - в скрипте запускает тупо утилитку psshutdown - она пробивает любую операционку (на 2000 shutdownа нет :( ).
Но я хочу добить - понять почему то, что по всем понятиям ДОЛЖНО работать - не работает :((.
Куча рассматриваемых вопросов в инете как зашатдаунить тачку в НТ. ВСЕ! копия моего (вернее наоборот) у них только после запуска процесса стоит дельфийская команда шатдауна :(. И видимо все работает - почему мой скрипт выполняющий стандартную команду шатдауна НА НЕЗАЛОГИНЕНОМ сервере не выполняется :(.


 
Ketmar ©   (2006-08-28 11:58) [24]

цитата:
The LogonUser function attempts to perform a user logon operation. You specify the user with a user name and domain, and authenticate the user with a clear-text password. If the function succeeds, you receive a handle to a token that represents the logged-on user. You can then use this token handle to impersonate the specified user, or in most cases, to create a process running in the context of the specified user.
логинься себе под админом и запускай под ним всё, что угодно.


 
BiN ©   (2006-08-28 12:02) [25]


> Kacnep ©   (28.08.06 11:54) [23]


Попробуй запустить скрипт шедулером. Если не вызывается, то проблема в скрипте или в ошибке системы. В этом случае нужно копать мс-овский технет.

Кстати, думаю, shutdown самостоятельно включает нужные привилегии.


 
Ketmar ©   (2006-08-28 12:05) [26]

> [25] BiN ©   (28.08.06 12:02)
ну не мешай, а? я тут так подло толкаю в сторону дебрей логина, а ты весь кайф ломаешь... %-)


 
BiN ©   (2006-08-28 12:18) [27]


> Ketmar ©   (28.08.06 12:05) [26]

Сусанин, блин.
-)


 
Kacnep ©   (2006-08-28 12:38) [28]

2 Ketmar
На всех серверах разные пароли и вшивать в прогу и каждый раз перекомпилить - не выход :(( В отдельном файле держать в незашифрованом виде нельзя :(.
Т.е. ЛОГОН кажеться никак применить тут нельзя... :(

2 BiN
Фантастика
Если я залогинен на сервер
то такой скрипт выполняеться
@echo time /t >c:\adm\start.log
ping 172.31.32.100 >c:\adm\ping.log
@echo time /t >c:\adm\stop.log
shutdown /r /f >c:\adm\s.log


Если незалогинен то шедулер запускает скрипт но ТОЛЬКО НЕ ШАТДАУН!!!
Все остальное отрабатывает...:(((


 
BiN ©   (2006-08-28 12:44) [29]


> Если незалогинен то шедулер запускает скрипт но ТОЛЬКО НЕ
> ШАТДАУН!!!
> Все остальное отрабатывает...:(((


Ты по ссылке в BiN ©   (25.08.06 12:19) [14] ходил?


 
umbra ©   (2006-08-28 20:10) [30]


>
> Если незалогинен то шедулер запускает скрипт но ТОЛЬКО НЕ
> ШАТДАУН!!!
>

Это настройка безопасности. Запустите из командной строки gpedit.msc и сделайте Enabled опцию Local computer policy\Computer Configuration\Security Settings\Local Policies\Security Options\Shutdown: Allow the system to be shut down without having to log on (Вин2003Сервер). По умолчанию запрещено гасить компьютер, если нет интерактивных сессий.


 
Kacnep ©   (2006-08-29 10:54) [31]

Установлена :((
НИКАКОЙ щатдаун если незалогинен не работает! :(
НИКАК!
Кажеться BiN ©   (28.08.06 12:44) [29]  прав.
На 2003 надо ставить какой то ХОТФИКС а на 2000?
Но главное выяснил - в процедуре выдачи прав - все верно. Значит приджется искать шатдаунитель нормальный %((.


 
Kacnep ©   (2006-09-01 10:15) [32]

Проблема до сих пор не снята. :(
Например выполняю команду в скрипте c:\windows\system32\shutdown.exe /? >c:\log.txt
Делаю логофф.
По шедулеру отрабатывает нормально. В лог.тхт хелп есть.
С помощью сервиса - длина файла лог.тхт =0 :( т.е. инфы в нем никакой нет.
Вывод - почему то не работает корректно процедура создания процесса :(
Полностью код всего проекта выложен выше.
Может кто нить сможет помочь? :(



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.013 c
2-1166887149
BanserAnt
2006-12-23 18:19
2007.01.14
Кто находится в чате?


15-1167084003
PHPdeveloper
2006-12-26 01:00
2007.01.14
PHP


2-1167051186
Numark
2006-12-25 15:53
2007.01.14
вопрос по ExcelApplication


15-1166556540
PHPDeveloper
2006-12-19 22:29
2007.01.14
Indy


15-1166456161
Ringo
2006-12-18 18:36
2007.01.14
О вредном излучении из системных блоков.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский